2011-01-01 19 views
5

Załóżmy, że mam kod podany w this tutorial.W V8, w jaki sposób usunąć owinięte obiektów C++ po ich odpowiedniki JavaScript są zbierane śmieci?

Jak zmodyfikować ten obiekt, aby utworzony obiekt C++ o nazwie Point ma wywoływany destruktor i jest usuwany z pamięci, gdy GC dla V8 niszczy opakowanie JavaScript?

+0

możliwe duplikat [Jak uwolnić zawinięty C obiekt ++ gdy wiąże obiekt Javascript jest śmieci zebranych w V8?] (Http: //stackoverflow.com/questions/173366/how-do-you- free-a-wrapped-c-object-when-associated-javascript-object-is-garbag) –

Odpowiedz

6

Chcesz utworzyć uchwyt Persistent i uczynić go słabym (v8 :: Persistent :: MakeWeak (dane, cb)). W wywołaniu zwrotnym można usunąć obiekt C++. Jak zwykle w przypadku garbage collector, dokładny czas, w którym zostanie określona słaba osiągalność, zależy od tego, kiedy GC jest wykonywane. Dzięki temu zasoby natywne mogą zostać zwolnione znacznie później niż się spodziewasz. Możesz poinformować V8 o ilości natywnych zasobów, które przechowujesz (v8 :: AdjustAmountOfExternalAllocatedMemory).

węzła „ObjectWrap” obudowuje rodzimej dwukierunkową/JS mapowanie obiektów i słaby callback: https://github.com/ry/node/blob/master/src/node_object_wrap.h

+1

Upewnij się, że wywołasz Dispose on Persistent Handle lub you dostanę wycieku pamięci. Po prostu spędziłem kilka godzin na śledzeniu tego w moim kodzie, w końcu użyłem wywołań ClearWeak(), Dispose(), Clear(), takich jak używa Object wrap destructor, i to naprawiło. – PherricOxide