9

非同期ノード アドオンを作成していますが、クライアントの 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 はどうなりますか?

4

1 に答える 1

1

String::New("foo")ヒープに何かを割り当ててハンドルを返すため、このハンドルが参照するメモリを何らかの方法で解放する必要があります。それらをHandleScopev8にアタッチすると、すべての参照がゼロにカウントされると、それが行われます。

ローカル ハンドルはスタックに保持され、適切なデストラクタが呼び出されると削除されます。これらのハンドルの有効期間は、多くの場合、関数呼び出しの開始時に作成されるハンドル スコープによって決定されます。ハンドル スコープが削除されると、ガベージ コレクターは、ハンドル スコープ内のハンドルによって以前に参照されていたオブジェクトの割り当てを自由に解除できますが、JavaScript または他のハンドルからアクセスできなくなっている場合に限ります。

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

于 2014-01-24T12:29:43.050 に答える