我正在为本机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
中的流浪std::set
个实例并清理被包装的对象,但由于上述错误,我无法自行清理包装器
那么,我该如何正确地做到这一点?
答案 0 :(得分:1)
我也收到了"Assertion persistent().IsNearDeath()' failed"
消息。
有一个node::AtExit()
函数在Node.js关闭之前运行 - 相当于process.on('exit')
。
将回调函数从附加组件的初始化函数(或适用的地方)传递给node::AtExit
。
此处记录了该功能: https://nodejs.org/api/addons.html#addons_atexit_hooks
例如:
NAN_MODULE_INIT(my_exports)
{
// other exported stuff here
node::AtExit(my_cleanup);
}
NODE_MODULE(my_module, my_exports) //add-on exports
//call C++ dtors:
void my_cleanup()
{
delete my_object_ptr; //call object dtor, or other stuff that needs to be cleaned up here
}