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