在异步插件中正确使用HandleScope

时间:2013-05-22 20:44:44

标签: node.js v8

我正在编写一个异步Node Addon,但我一直在努力弄清楚是否需要在调用客户端JavaScript回调的“After”函数中使用HandleScope。我已经看到了有和没有新范围的示例,但从来没有任何解释原因。这是一个例子:

void asyncWorkAfter(uv_work_t* req) {
   HandleScope scope; // <-- Do you need a new scope?

   const int argc = 1;
   Local<Value> foo = String::New("foo");
   Local<Value> argv[] = { foo };

   // assume I got my callback function out of req
   callback->Call(Context::GetCurrent()->Global(), argc,  argv);

   callback.Dispose();

   // if i use a new HandleScope, what happens to argv when we go out of scope?
   // Do i need to do something like a scope.Close() to copy argv to the parent scope?
}

拨打回叫电话时是否需要/想要一个HandleScope? 如果您使用新的HandleScope,示例中的argv会发生什么?

1 个答案:

答案 0 :(得分:1)

String::New("foo")将在堆上分配一些东西并返回一个句柄,因此你需要释放这个句柄所引用的内存。如果将它们附加到HandleScope v8,一旦所有引用都计为零,就会为您执行此操作。

  

本地句柄保存在堆栈中,并在适当时删除   析构函数被称为。这些句柄的生命周期由a决定   处理范围,通常在函数的开头创建   呼叫。删除句柄范围时,垃圾收集器是免费的   解除以前由句柄中引用的那些对象   处理范围,只要它们不再可以从JavaScript访问   或其他手柄。

https://developers.google.com/v8/embed