gpt4 book ai didi

javascript - 如何将事件处理程序附加到 native Node.js 模块中的进程导出?

转载 作者:行者123 更新时间:2023-11-30 05:42:24 25 4
gpt4 key购买 nike

我正在为原生 Node.js 模块实现正确的内存管理。我遇到了这个问题中描述的问题:
node.js native addon - destructor of wrapped class doesn't run

建议的解决方案是将 native 对象的析构函数绑定(bind)到 process.on('exit'),但是答案不包含如何在 native 模块中执行此操作。

我也简要浏览了 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 并得到了同样的断言错误。

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

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

最佳答案

我还收到了 “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
}

关于javascript - 如何将事件处理程序附加到 native Node.js 模块中的进程导出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30681131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com