В V8, как бы я удалил обернутые объекты C ++ после того, как их аналоги JavaScript собраны в мусор? - PullRequest
5 голосов
/ 01 января 2011

Допустим, у меня есть код, указанный в этом руководстве .

Как бы я изменил это так, чтобы создаваемый объект Point C ++ вызывал деструктор и удалялся из памяти, когда GC для V8 разрушает оболочку JavaScript?

1 Ответ

7 голосов
/ 09 января 2011

Вы хотите создать постоянный дескриптор и сделать его слабым (v8 :: Persistent :: MakeWeak (data, cb)). В обратном вызове вы можете удалить объект C ++. Как обычно с сборщиком мусора, точное время, в которое будет определена слабая достижимость, зависит от того, когда выполняется GC. Поэтому родные ресурсы могут быть освобождены намного позже, чем вы ожидаете. Вы можете сообщить V8 о количестве имеющихся у вас собственных ресурсов (v8 :: AdjustAmountOfExternalAllocatedMemory).

Узел ObjectWrap инкапсулирует двунаправленное сопоставление нативных / JS-объектов и слабый обратный вызов: https://github.com/ry/node/blob/master/src/node_object_wrap.h

...