ネイティブ Node.js モジュールの正しいメモリ管理の実装に取り組んでいます。この質問で説明されている問題に遭遇しました:
node.js ネイティブ アドオン - ラップされたクラスのデストラクタが実行されません
提案された解決策は、ネイティブ オブジェクトのデストラクタを にバインドすることですがprocess.on('exit')
、答えにはネイティブ モジュールでそれを行う方法が含まれていません。
libuv docs も簡単に調べましたが、この点に関しても有用なものは何も含まれていませんでした。
注: オブジェクトを取得することに特に興味はありません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
し、ラップされたオブジェクトをクリーンアップすることですが、上記のエラーのために、ラッパー自体をクリーンアップできませんでした。
では、どうすればこれを適切に行うことができますか?