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

Надеюсь это поможет

Другие вопросы по тегам