【发布时间】:2015-06-06 09:24:58
【问题描述】:
我正在为原生 Node.js 模块实现正确的内存管理。我遇到了这个问题中描述的问题:
node.js native addon - destructor of wrapped class doesn't run
建议的解决方案是将本机对象的析构函数绑定到process.on('exit'),但答案不包含如何在本机模块中执行此操作。
我也简要查看了 libuv 文档,但它们也没有包含任何在这方面有用的内容。
注意:我对获取 process 对象并不是特别感兴趣,但我尝试过这样做:
auto globalObj = NanGetCurrentContext()->Global();
auto processObj = ::v8::Handle<::v8::Object>::Cast(globalObj->Get(NanNew<String>("process")));
auto processOnFunc = ::v8::Handle<::v8::Function>::Cast(processObj->Get(NanNew<String>("on")));
Handle<Value> processOnExitArgv[2] = { NanNew<String>("exit"), NanNew<FunctionTemplate>(onProcessExit)->GetFunction() };
processOnFunc->Call(processObj, 2, processOnExitArgv);
然后的问题是我在尝试删除我的对象时收到此消息:
Assertion `persistent().IsNearDeath()' failed.
我也尝试使用std::atexit 并得到相同的断言错误。
到目前为止,我能做的最好的事情是在std::set 中收集流浪的ObjectWrap 实例并清理被包装的对象,但由于上述错误,我无法自己清理包装器。
那么,我该如何正确地做到这一点呢?
【问题讨论】:
-
您的问题是关于注册处理程序还是关于获取
process对象?您使用的是什么版本的 node.js(您是要定位0.10.x、0.12.x还是两者)? -
@t.niese 我对获取
process对象不感兴趣,只是为了能够在 v8 停止时注册一个事件,这样我就可以删除 v8 的 GC 没有删除的对象.我更喜欢适用于多个节点版本的解决方案,但我使用0.12.x -
即使在 V8 内部有一个内部/直接的方式来监听退出,我仍然会使用你在 js 中做的等效方式,直接在
process.on('exit')上注册一个事件处理程序。因此,您需要获取process对象并在其上调用on函数,传递您的包装回调。 -
要创建可以在不同版本的节点上运行的模块,你应该看看nan,因为不同版本的节点之间有很大的变化。
-
@t.niese 我已经在使用 Nan,是的。
标签: javascript c++ node.js node.js-addon