【发布时间】:2021-04-24 02:49:56
【问题描述】:
我有一个使用 Nan 库的 c++ 节点插件。我有一个需要返回缓冲区的函数。最简单的版本如下(代码按照cmets编辑):
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();
}
任何帮助将不胜感激。
【问题讨论】:
-
(1) gc 例程调用
free而不是delete("...数据将通过调用free()..." ); (2) 通过union给指针起别名是Undefined Behaviour; (3) 即使是名为delete的 gc 例程,它也会尝试删除别名指针 UB。 -
@RichardCritten 谢谢。我将如何达到预期的结果?重新解释演员阵容会起作用吗?删除与免费的观点是正确的,但在这里并没有伤害到我,因为没有什么可以破坏的。
-
如果你不将
new/delete和malloc/free配对,那么代码就在UB 领域,尝试推理它是没有意义的。 -
@RichardCritten 好的,所以解决方案是使用 malloc 而不是 new。我会试试的。
-
@RichardCritten 相同的泄漏,更改为 malloc 后(在问题中编辑)
标签: c++ node.js memory-leaks v8 node-addon-api