C++ Magick++/NAPI模块内存泄漏

C++ Magick++/NAPI模块内存泄漏,c++,node.js,v8,magick++,node-addon-api,C++,Node.js,V8,Magick++,Node Addon Api,我正在使用节点插件api编写本机模块,该api利用了Magick++库。该模块获取图像的文件路径以及一些参数,并返回一个缓冲区。我似乎遇到了一个非常严重的内存泄漏问题,Massif报告说它与创建的缓冲区或Magick++映像有关。这是我的C++代码: #包括 #包括 #包括 使用名称空间std; 使用名称空间Magick; FlipWorker类:公共Napi::AsyncWorker{ 公众: FlipWorker(Napi::函数和回调、字符串在_路径中、布尔触发器、字符串类型、整数延迟)

我正在使用节点插件api编写本机模块,该api利用了Magick++库。该模块获取图像的文件路径以及一些参数,并返回一个缓冲区。我似乎遇到了一个非常严重的内存泄漏问题,Massif报告说它与创建的缓冲区或Magick++映像有关。这是我的C++代码:

#包括
#包括
#包括
使用名称空间std;
使用名称空间Magick;
FlipWorker类:公共Napi::AsyncWorker{
公众:
FlipWorker(Napi::函数和回调、字符串在_路径中、布尔触发器、字符串类型、整数延迟)
:Napi::AsyncWorker(回调)、in_路径(in_路径)、flop(flop)、type(type)、delay(delay){
~FlipWorker(){}
void Execute(){
列出框架;
合并列表;
列表中期;
列出结果;
读取图像(帧和帧,在_路径中);
合并图像(&合并,frames.begin(),frames.end());
用于(图像和图像:合并){
flop?image.flop():image.flip();
magick(类型);
mid.push_back(图像);
}
优化ImageLayers(&result,mid.begin(),mid.end());
如果每个(result.begin()、result.end()、animationDelayImage(delay))的(delay!=0);
writeImages(result.begin()、result.end()、和blob);
}
void OnOK(){
Callback().Call({Env().Undefined(),Napi::Buffer::Copy(Env(),(char*)blob.data(),blob.length())});
}
私人:
_路径中的字符串,类型;
bool-flop;
整数延迟;
一团一团;
};
Napi::值翻转(常量Napi::回调信息和信息)
{
Napi::Env Env=info.Env();
Napi::Object obj=info[0].As();
Napi::函数cb=info[1].As();
字符串路径=obj.Get(“路径”).As().Utf8Value();
bool flop=obj.Has(“flop”)?obj.Get(“flop”).As().Value():false;
字符串类型=obj.Get(“type”).As().Utf8Value();
int delay=obj.Get(“delay”).As().Int32Value();
FlipWorker*FlipWorker=新的FlipWorker(cb、路径、触发器、类型、延迟);
flipWorker->Queue();
返回env.Undefined();
}
Napi::对象初始化(Napi::Env Env,Napi::对象导出){
exports.Set(Napi::String::New(env,“flip”),Napi::Function::New(env,flip));
出口退税;
}
节点API模块(插件,初始化);
还有一个示例JS脚本:

const image=require(“./build/Release/image.node”);
设置间隔(()=>{
image.flip({path:“/home/esm/animated.gif”,键入:“gif”,延迟:0},(错误,缓冲区)=>{
日志(缓冲区);
log(process.memoryUsage().rss);
});
}, 10000);
以下是脚本的示例输出:

<Buffer 47 49 46 38 39 61 80 02 66 01 f7 00 00 38 44 3a 62 58 26 70 64 27 12 1c 4d 19 26 50 26 30 57 10 38 79 2c 37 67 35 51 57 14 47 79 35 4a 71 55 4f 4f 68 ... 868294 more bytes>
69496832
<Buffer 47 49 46 38 39 61 80 02 66 01 f7 00 00 38 44 3a 62 58 26 70 64 27 12 1c 4d 19 26 50 26 30 57 10 38 79 2c 37 67 35 51 57 14 47 79 35 4a 71 55 4f 4f 68 ... 868294 more bytes>
110673920
<Buffer 47 49 46 38 39 61 80 02 66 01 f7 00 00 38 44 3a 62 58 26 70 64 27 12 1c 4d 19 26 50 26 30 57 10 38 79 2c 37 67 35 51 57 14 47 79 35 4a 71 55 4f 4f 68 ... 868294 more bytes>
152092672
<Buffer 47 49 46 38 39 61 80 02 66 01 f7 00 00 38 44 3a 62 58 26 70 64 27 12 1c 4d 19 26 50 26 30 57 10 38 79 2c 37 67 35 51 57 14 47 79 35 4a 71 55 4f 4f 68 ... 868294 more bytes>
192970752
<Buffer 47 49 46 38 39 61 80 02 66 01 f7 00 00 38 44 3a 62 58 26 70 64 27 12 1c 4d 19 26 50 26 30 57 10 38 79 2c 37 67 35 51 57 14 47 79 35 4a 71 55 4f 4f 68 ... 868294 more bytes>
204517376

69496832
110673920
152092672
192970752
204517376
如您所见,每次运行函数时,驻留集的大小都会显著增加。这种情况会发生在我使用的任何格式的每个图像上。如何防止代码泄漏?提前谢谢

编辑:
我做了一些进一步的挖掘,结果表明,由于缓冲区不是通过JS创建的,因此不能以同样的方式进行垃圾收集。我现在想知道是否有可能创建一个缓冲区,该缓冲区通过V8进行垃圾收集,并且仍然提供相同的数据。

如果等待更多的迭代,内存消耗是否最终会下降(表示垃圾收集器开始工作),还是进程最终会因内存不足而崩溃?@jmrk进程似乎会因内存不足错误而崩溃。如果等待更多的迭代,内存消耗是否最终会下降(表示垃圾收集器正在启动),还是进程最终会因内存不足而崩溃?@jmrk该进程似乎因内存不足错误而崩溃。