2011-01-01 7 views
5

Nehmen wir an, ich habe den Code in this tutorial zur Verfügung gestellt.Wie entferne ich in V8 umgebrochene C++ - Objekte, nachdem ihre JavaScript-Gegenstücke durch Garbage Collection gesammelt wurden?

Wie würde ich dies ändern, so dass das C++ - Objekt Point, das erstellt wird, seinen Destruktor aufgerufen hat und aus dem Speicher gelöscht wird, wenn der GC für V8 den JavaScript-Wrapper zerstört?

+0

möglich Duplikat [Wie befreien Sie ein verpacktes C++ Objekt, wenn zugehöriges Javascript-Objekt Müll in V8 gesammelt?] (Http: //stackoverflow.com/questions/173366/how-do-you-free-a-wrapped-c-object-when-associated-javascript-object-is-garbag) –

Antwort

6

Sie möchten ein persistentes Handle erstellen und es schwach machen (v8 :: Persistent :: MakeWeak (data, cb)). Im Callback können Sie das C++ Objekt löschen. Wie bei einem Garbage Collector üblich, hängt die genaue Zeit, zu der die Erreichbarkeit bestimmt wird, davon ab, wann GC durchgeführt wird. Native Ressourcen können daher viel später als erwartet freigegeben werden. Sie können V8 darüber informieren, wie viele systemeigene Ressourcen Sie haben (v8 :: AdjustAmountOfExternalAllocatedMemory).

Knotens „ObjectWrap“ kapselt das bidirektionale nativen/JS-Objekt-Mapping und schwachen Rückruf: https://github.com/ry/node/blob/master/src/node_object_wrap.h

+1

Stellen Sie sicher, dass Sie Dispose auf dem persistenten Handle oder Ihnen aufrufen bekomme ein Speicherleck. Ich habe nur ein paar Stunden damit verbracht, das in meinem Code nachzuverfolgen, und habe schließlich die Aufrufe ClearWeak(), Dispose(), Clear() wie den Wrapping-Destruktor des Objekts verwendet und es repariert. – PherricOxide