如何解决节点插件 Nan::NewBuffer 导致内存泄漏
我有一个使用 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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。