2011-01-01 6 views
5

コードがthis tutorialで提供されているとします。V8では、JavaScriptの対応部分がガベージコレクションされた後に、ラップされたC++オブジェクトを削除するにはどうすればよいですか?

Point V8のGCがJavaScriptラッパーを破棄すると、作成されたC++オブジェクトのデストラクタが呼び出され、メモリから削除されます。

+0

が重複する可能性: //stackoverflow.com/questions/173366/how-do-you-free-a-wrapped-c-object-when-associated-javascript-object-is-garbag) –

答えて

6

永続ハンドルを作成して弱くする必要があります(v8 :: Persistent :: MakeWeak(data、cb))。コールバックでは、C++オブジェクトを削除できます。いつものようにガベージコレクタでは、弱い到達可能性が決定される正確な時間は、GCがいつ実行されるかに依存します。したがって、ネイティブリソースは、予想よりもずっと解放される可能性があります。 V8には、保持しているネイティブ・リソースの量を通知できます(v8 :: AdjustAmountOfExternalAllocatedMemory)。

ノードのは「ObjectWrapは、」双方向ネイティブ/ JSオブジェクトのマッピングと弱いコールバックをカプセル化:https://github.com/ry/node/blob/master/src/node_object_wrap.h

[あなたが関連付けられているJavaScriptオブジェクトがガベージはV8に収集されたラップC++オブジェクトを解放するにはどうすればよい?](HTTPの
+1

永続ハンドルでDisposeを呼び出すか、メモリリークが発生します。私のコードでそれを追跡するのに数時間を費やし、最終的にClearWeak()、Dispose()、Clear()コールをObjectラップデストラクタの使用と同様に使用して修正しました。 – PherricOxide