如何将事件处理程序附加到本机Node.js模块中进程的出口?

时间:2015-06-06 09:24:58

标签: javascript c++ node.js node.js-addon

我正在为本机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个实例并清理被包装的对象,但由于上述错误,我无法自行清理包装器

那么,我该如何正确地做到这一点?

1 个答案:

答案 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
}