我正在为原生 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
并得到相同的断言错误。
到目前为止,我能做的最好的事情就是ObjectWrap
在 an 中收集流浪实例std::set
并清理被包裹的对象,但是由于上述错误,我无法自己清理包裹器。
那么,我怎样才能正确地做到这一点?