问题描述
我有一个使用 Nan 库的 C++ 节点添加。我有一个需要返回缓冲区的函数。最简单的版本如下(根据注释编辑代码):
NAN_METHOD(Test) {
char * retVal = (char*)malloc(100 * sizeof(char));
info.GetReturnValue().Set(Nan::NewBuffer(retVal,100 *sizeof(char)).ToLocalChecked());
}
其中联合仅用作重新解释字节的简单方法。根据 documentation,Nan::NewBuffer 承担内存的所有权,因此无需手动释放内存。但是,当我运行使用此函数的节点代码时,即使我强制垃圾收集器通过 global.gc();
运行,我的内存也会猛增。产生错误的节点代码非常简单:
const addon = require("addon");
for (let i = 0; i < 100000000; i++) {
if(i % (1000000) === 0){
console.log(i);
try {
global.gc();
} catch (e) {
console.log("error garbage collecting");
process.exit();
}
}
const buf = addon.test();
}
任何帮助将不胜感激。
解决方法
经过大量实验和研究,我发现这篇文章enter link description here 基本上声明释放传递给 Nan::NewBuffer 的内存的承诺只是一个谎言。使用 Nan::CopyBuffer 而不是 Nan::NewBuffer 以 memcpy 为代价解决了这个问题。所以本质上,答案是 Nan::NewBuffer 坏了,你不应该使用它。改用 Nan::CopyBuffer。