2013-05-22 9 views
8

Ich schreibe ein asynchrones Node-Addon, aber ich habe Mühe, herauszufinden, ob ich ein HandleScope in der "After" -Funktion verwenden muss, die den Client-JavaScript-Callback aufruft. Ich habe Beispiele mit und ohne neue Bereiche gesehen, aber nie eine Erklärung warum. Hier ein Beispiel:Korrekte Verwendung von HandleScope im asynchronen Addon

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? 
} 

Benötigen/benötigen Sie ein HandleScope, wenn Sie den Callback anrufen?
Was passiert mit argv im Beispiel, wenn Sie ein neues HandleScope verwenden?

+1

Mein understaning ist, dass Sie HandleScope jedes Mal, wenn Sie vor Ort benötigen, die ordnungsgemäß gesammelt Einheimischen werden können. –

Antwort

1

String::New("foo") wird etwas auf Heap zuweisen und ein Handle zurückgeben, so dass Sie den Speicher freigeben müssen, auf den dieses Handle verweist, wie. Wenn Sie sie an eine HandleScope V8 anhängen, wird dies für Sie tun, sobald alle Referenzen auf Null gezählt werden.

Lokale Handles werden auf einem Stack gehalten und gelöscht, wenn der entsprechende Destruktor aufgerufen wird. Die Gültigkeitsdauer dieser Handles wird durch einen Handle-Bereich bestimmt, der oft zu Beginn einer Funktion Aufruf erstellt wird. Wenn der Handlebereich gelöscht wird, ist der Garbage Collector frei , um die zuvor von Handles im Handlebereich referenzierten Objekte aufzuheben, sofern sie nicht mehr von JavaScript oder anderen Handles zugegriffen werden können.

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

Verwandte Themen