Napi :: ObjectWrap:是一个析构函数,如何调用?

贝诺·拉霍兹(BenoîtLahoz)

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

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

my_object -> MyObject -> Napi::ObjectWrap<MyObjectWrapper>

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

我对node-addon-api相当陌生,我不确定是否需要了解垃圾收集器。

我想知道的是何时以及如何破坏包装器,以及将null传递给Javascript端的对象是否有任何效果。任何线索,将不胜感激。

廖志伟

我是像您这样的node-addon-api初学者。我在Github中找到了答案。

这是未调用的链接Destructor

我的理解是,当内存不足时,V8 GC将运行。因此,如果要调用属于c ++实例的ObjectWrapper的析构函数,则应强制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

希望这可以帮助

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何测试linux NAPI功能?

如何测试linux NAPI功能?

如何使用返回Promises的NAPI创建异步函数

如何从析构函数中返回一个变量

如何将NAPI轮询功能卸载到工作队列

如何将napi_threadsafe_function用于NodeJS本机插件

如何在节点v10的Google Cloud Functions中使用ffi-napi

在NAPI中使用libsodium

为什么同一个类对象的构造函数和析构函数被隐式调用多次

删除另一个类中一个类的对象时析构函数如何工作

析构函数调用

C ++如何自动调用析构函数?

如何指定析构函数调用的顺序?

为什么数组中的对象的析构函数被另一个替换时没有被调用?

什么时候在C ++中确切地调用了一个类的析构函数?

移动语义:为什么在移动的实例上调用析构函数,这是一个问题吗?

在以下情况下,手动调用析构函数是否是一个错误的设计决策?

声明一个空的析构函数可以防止编译器调用memmove()复制连续对象

有一个构造函数,但有两个析构函数

在IRQ合并之前,NAPI有哪些优势?

关于Linux内核中的NAPI实现

使析构函数受保护以通过带有虚函数的基类禁用删除调用是一个好主意吗

从析构函数调用BeginInvoke

当可以在另一个对象中更改一个对象时,如何在C ++中使用析构函数

在Visual Studio中,当与std :: async一起使用时,不会调用“ thread_local”变量析构函数,这是一个错误吗?

如何从析构函数调用const成员函数

std :: is_nothrow_move_constructible是否需要一个noexcept析构函数?

为什么析构函数需要一个未被删除的对象?

声明需要一个退出时间析构函数[-Werror,-Wexit-time-destructors]