我正在编写一个异步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会怎样?

最佳答案

String::New("foo")将在堆上分配一些内容并返回一个句柄,因此您需要以某种方式释放此句柄引用的内存。如果将它们附加到HandleScope v8,则所有引用都计数为零后,v8会为您执行此操作。



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

09-19 08:00