在asynchronous插件中正确使用HandleScope

我正在编写一个asynchronous节点插件,但我一直在努力弄清楚,如果我需要在调用客户端JavaScriptcallback的“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中,那么一旦所有引用计数为零,都将为您执行此操作。

本地句柄被保存在堆栈中,并在调用适当的析构函数时被删除。 这些句柄的生命周期由句柄范围决定,句柄范围通常在函数调用的开始处创build。 当删除句柄范围时,垃圾收集器可以自由地释放那些先前由句柄范围中的句柄引用的对象,只要它们不再能够从JavaScript或其他句柄访问。

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