2011-01-01 14 views
5

Diciamo che ho il codice fornito in this tutorial.In V8, come rimuoverei oggetti C++ spostati dopo che le loro controparti JavaScript sono state raccolte?

Come dovrei modificare questo in modo che l'oggetto C++ Point creato abbia chiamato il suo distruttore e venga cancellato dalla memoria quando il GC per V8 distrugge il wrapper JavaScript?

+0

possibile duplicato di [Come si fa a liberare un oggetto avvolto C++ quando l'oggetto JavaScript associato è spazzatura raccolta in V8?] (Http: //stackoverflow.com/questions/173366/how-do-you-free-a-wrapped-c-object-when-associated-javascript-object-is-garbag) –

risposta

6

Si desidera creare un handle persistente e renderlo debole (v8 :: Persistent :: MakeWeak (data, cb)). Nel callback puoi cancellare l'oggetto C++. Come al solito con un garbage collector, il tempo esatto in cui verrà determinata la raggiungibilità debole dipende da quando viene eseguito GC. Le risorse native possono quindi essere liberate molto più tardi del previsto. È possibile informare V8 sulla quantità di risorse native che si stanno tenendo (v8 :: AdjustAmountOfExternalAllocatedMemory).

nodo del "ObjectWrap" incapsula il nativo bidirezionale/mappatura oggetto JS e callback deboli: https://github.com/ry/node/blob/master/src/node_object_wrap.h

+1

Assicurati di chiamare Dispose sul Handle persistente o tu Prenderò una perdita di memoria. Ho appena trascorso alcune ore a rintracciarlo nel mio codice, infine ho usato le chiamate ClearWeak(), Dispose(), Clear() come l'Object wrap destructor usa e l'ha riparato. – PherricOxide

Problemi correlati