我正在编写一个异步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会发生什么?
答案 0 :(得分:1)
String::New("foo")
将在堆上分配一些东西并返回一个句柄,因此你需要释放这个句柄所引用的内存。如果将它们附加到HandleScope
v8,一旦所有引用都计为零,就会为您执行此操作。
本地句柄保存在堆栈中,并在适当时删除 析构函数被称为。这些句柄的生命周期由a决定 处理范围,通常在函数的开头创建 呼叫。删除句柄范围时,垃圾收集器是免费的 解除以前由句柄中引用的那些对象 处理范围,只要它们不再可以从JavaScript访问 或其他手柄。