1

我正在为原生 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并清理被包裹的对象,但是由于上述错误,我无法自己清理包裹器。

那么,我怎样才能正确地做到这一点?

4

1 回答 1

1

我也收到了"Assertion persistent().IsNearDeath()' failed"消息。

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

node::AtExit将回调函数从您的附加组件的 init 函数(或任何适当的地方)中传递。

该函数记录在这里: 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
}
于 2018-01-15T03:01:42.327 回答