Javascript 如何将事件处理程序附加到流程';是否退出本机Node.js模块?

Javascript 如何将事件处理程序附加到流程';是否退出本机Node.js模块?,javascript,c++,node.js,node.js-addon,Javascript,C++,Node.js,Node.js Addon,我正在为native Node.js模块实现正确的内存管理。我遇到了这个问题中描述的问题: 建议的解决方案是将本机对象的析构函数绑定到进程上('exit'),但是答案不包含如何在本机模块中执行此操作 我也简要地看了一下libuv文档,但是它们在这方面也没有包含任何有用的内容 注意:我对获取进程对象不是特别感兴趣,但我是这样尝试的: auto globalObj = NanGetCurrentContext()->Global(); auto processObj = ::v8::Hand

我正在为native Node.js模块实现正确的内存管理。我遇到了这个问题中描述的问题:

建议的解决方案是将本机对象的析构函数绑定到
进程上('exit')
,但是答案不包含如何在本机模块中执行此操作

我也简要地看了一下libuv文档,但是它们在这方面也没有包含任何有用的内容

注意:我对获取
进程
对象不是特别感兴趣,但我是这样尝试的:

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);
我还尝试使用
std::atexit
,得到了相同的断言错误

到目前为止,我所能做的最好的事情就是在
std::set
中收集散乱的
ObjectWrap
实例并清理包装对象,但由于上述错误,我无法清理包装器本身


那么,我如何才能正确地做到这一点呢?

我还收到了
“Assertion persistent().IsNearDeath()”failed“
消息

有一个
node::AtExit()
函数在node.js关闭之前运行,相当于
process.on('exit')

将回调函数从外接程序的init函数中传递到
node::AtExit
(或适当的地方)

此处记录了该功能:

例如:

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
}

您的问题是关于注册处理程序还是关于获取
进程
对象?您使用的node.js的版本是什么(您希望以
0.10.x
0.12.x
为目标,还是两者兼而有之)?@t.niese我对获取
进程
对象不感兴趣,只是为了能够在v8停止时注册一个事件,这样我就可以删除v8的GC没有删除的对象。我更喜欢在多个版本的node上工作的解决方案,但我使用
0.12.x
即使V8中有一种内部/直接的方法来监听退出,我仍然会使用与js中相同的方法,直接在
process.on('exit')
上注册事件处理程序。因此,您需要获取
进程
对象,并通过包装的回调对其调用
on
函数。要创建将在不同版本的节点上运行的模块,您应该看看,因为不同版本的节点之间有很大的变化。@t.niese我已经在使用Nan,是的。
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
}