0

Persistent ハンドルを weak にしようとすると、WeakReferenceCallback が呼び出されないのはなぜですか? 次のサンプルを参照してください。

void myWeakReferenceCallback(v8::Persistent<v8::Value> theValue, void *theParameter)
{
    fprintf(stdout, "myWeakReferenceCallback");
}

void testWeakReferenceCallback()
{
    v8::Persistent<v8::Value> persistent_value;
    {
        v8::Persistent<v8::Context> context = v8::Context::New();
        v8::Context::Scope context_scope(context);
        v8::HandleScope handle_scope;
        v8::Local<v8::Value> local_value = v8::NumberObject::New(5.0);
        persistent_value = v8::Persistent<v8::Value>::New(local_value);
        persistent_value.MakeWeak(NULL, myWeakReferenceCallback);
        context.Dispose();
    }
    persistent_value.Dispose();
}
4

1 に答える 1

1

2 つの問題があると思います。

  1. V8 がコールバックを呼び出す機会を得る前に、弱いハンドルを破棄しています。コールバック内で破棄する必要があります。
  2. V8 は、GC を実行するまで弱いハンドルのコールバックを呼び出しません。

これを試して:

void myWeakReferenceCallback(v8::Persistent<v8::Value> theValue, void *theParameter)
{
    fprintf(stdout, "myWeakReferenceCallback");
    theValue.Dispose();
}

void testWeakReferenceCallback()
{
    v8::Persistent<v8::Value> persistent_value;
    {
        v8::Persistent<v8::Context> context = v8::Context::New();
        v8::Context::Scope context_scope(context);
        v8::HandleScope handle_scope;
        v8::Local<v8::Value> local_value = v8::NumberObject::New(5.0);
        persistent_value = v8::Persistent<v8::Value>::New(local_value);
        persistent_value.MakeWeak(NULL, myWeakReferenceCallback);
        context.Dispose();
    }
    //persistent_value.Dispose();
    while (!v8::V8::IdleNotification()); // force GC
}
于 2013-03-13T04:54:40.523 に答える