Napi::ObjectWrap: называется деструктор и как?
Я создаю аддон для node.js благодаря node-addon-api.
Каждый из моих "традиционных" классов C++ оборачивает объект C. Затем мои классы Napi::ObjectWrap обертывают эти объекты C++.
my_object -> MyObject -> Napi::ObjectWrap<MyObjectWrapper>
Экземпляр MyObjectWrapper содержит ссылку на экземпляр MyObject, который содержит ссылку на экземпляр my_object. Поскольку объект C должен быть освобожден, я думал, что деструктор MyObject сделает эту работу, но она никогда не вызывается оболочкой.
Я довольно новичок в node-addon-api, и я не уверен, что понимаю сборщик мусора, если это необходимо.
Я хотел бы знать, когда и как уничтожается оболочка, и если передача значения null объекту на стороне Javascript имеет какой-либо эффект. Любая подсказка по этому вопросу будет принята с благодарностью.
0 ответов
Я новичок в node-addon-api, как и вы, и нахожу ответ в Github.
Вот ссылка Деструктор не вызывается
Насколько я понимаю, сборщик мусора V8 запускается, когда памяти становится недостаточно. Поэтому, если вы хотите вызвать деструктор, принадлежащий ObjectWrapper экземпляра C++, вы должны принудительно запустить gc.
Пример кода выглядит следующим образом:
var createObject = require('bindings')('addon'); //
function forceGC() {
if (global.gc) {
global.gc();
} else {
console.warn('No GC hook! Start your program as `node --expose-gc ./addon.js`.');
}
}
var obj = createObject(10); //creat ObjectWrapper from c++ to V8
console.log(obj);
console.log( obj.plusOne() ); // 11
console.log( obj.plusOne() ); // 12
console.log( obj.plusOne() ); // 13
obj=null;
forceGC();//after forceGC ,the c++ destructor function will call
Надеюсь это поможет