节点插件 Nan::NewBuffer 导致内存泄漏

时间:2021-01-19 18:50:30

标签: c++ node.js memory-leaks v8 node-addon-api

我有一个使用 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();
}

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

经过大量实验和研究,我发现这篇文章enter link description here 基本上声明释放传递给 Nan::NewBuffer 的内存的承诺只是一个谎言。使用 Nan::CopyBuffer 而不是 Nan::NewBuffer 以 memcpy 为代价解决了这个问题。所以本质上,答案是 Nan::NewBuffer 坏了,你不应该使用它。改用 Nan::CopyBuffer。