1

ネイティブ 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し、ラップされたオブジェクトをクリーンアップすることですが、上記のエラーのために、ラッパー自体をクリーンアップできませんでした。

では、どうすればこれを適切に行うことができますか?

4

1 に答える 1