【问题标题】:Napi::ObjectWrap: is a destructor called and how?Napi::ObjectWrap: 是一个析构函数,如何调用?
【发布时间】:2019-04-25 15:06:56
【问题描述】:

感谢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 端的对象是否有任何影响。 对此的任何线索将不胜感激。

【问题讨论】:

    标签: javascript c++ node.js-addon node-addon-api


    【解决方案1】:

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

    这是链接Destructor not called

    我的理解是 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
    
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2016-12-12
      • 2014-05-17
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2020-03-22
      • 2021-11-26
      相关资源
      最近更新 更多