首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Napi::ObjectWrap:是否调用析构函数?如何调用?

Napi::ObjectWrap:是否调用析构函数?如何调用?
EN

Stack Overflow用户
提问于 2019-04-25 23:06:56
回答 1查看 855关注 0票数 1

多亏了node-addon-api,我正在为node.js构建一个插件。

我的每个“传统型”C++类都包装了一个C对象。然后我的Napi::ObjectWrap类包装这些C++对象。

代码语言:javascript
复制
my_object -> MyObject -> Napi::ObjectWrap<MyObjectWrapper>

MyObjectWrapper实例包含对MyObject实例的引用,该实例包含对my_object实例的引用。因为需要释放C对象,所以我认为MyObject的析构函数可以完成这项工作,但包装器从未调用过它。

我对node-addon-api还是个新手,我不确定是否能像所需的那样理解垃圾收集器。

我想知道的是包装器何时以及如何被销毁,以及在Javascript端将null传递给对象是否有任何效果。任何关于这方面的线索都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-11 01:19:34

我和你一样是node-addon-api的初学者,我在Github找到了答案。

这里是链接Destructor not called

我的理解是,当内存不足时,V8 GC会运行。因此,如果您想调用属于c++实例的ObjectWrapper的析构函数,则应该强制gc运行。

示例代码如下:

代码语言:javascript
复制
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

希望这能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55852447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档