Я работаю над реализацией правильного управления памятью для собственного модуля Node.js. Я столкнулся с проблемой, описанной в этом вопросе:
Родной аддон node.js — деструктор упакованного класса не запускается
Предлагаемое решение — связать деструкторы нативных объектов с 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
и очистка обернутых объектов, но из-за вышеуказанной ошибки я не смог очистить сами обертки.
Итак, как я могу сделать это правильно?
Я также получал "Assertion persistent().IsNearDeath()' failed"
сообщение.
Eсть 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
}