0

Av8::Handle<v8::Object>は、ネイティブ クラスをそのメンバーの一部とともにパックします。これがどのように機能するかです:

someobj = window.createNewWrappedClassObject();
[object Object] { fn1:[function], fn2:[function] .... destroy:[function] };

someobj.fn1(); [...] // do something with someobj
someobj.destroy();   // when done, call destroy(). now someobj not only would be
                     // inoperable, it would also get set to {} or null or etc.

someobj.fn1()someobj.fn2()someobj.destroy()ラップされた関数です。コンストラクターの初期化ロジックは次のようになります。

WrappedClass::GetWrappedObject(){
    Local<ObjectTemplate> objectTemplate = ObjectTemplate::New();
    objectTemplate->SetInternalFieldCount(1);
    this->instance = objectTemplate->NewInstance();
    this->instance->SetPointerInInternalField(0, this);
    this->instance->Set(String::New("fn1"), 
        FunctionTemplate::New(Fn1)->GetFunction());
    [...] // so on
}

destroy()今問題は、私が基本的にやりたかったことを呼び出すとき、そのオブジェクトへのすべての参照を強制的に にすることでしたnull。だからここに私が考えたことがあります:

 Handle<Value> WrappedClass::Fn1(const Arguments& args){
    WrappedClass * CurrentInstance = 
        static_cast<WrappedClass *>(args.This()->GetPointerFromInternalField(0));
    CurrentInstance->~WrappedClass();
    CurrentInstance->instance->Clear(); // tricky part right here and
    args.This()->Clear();               // also here on these two lines
    return v8::Null(); 
}

何が起こるのですか?何も起こらず、関数が実際に戻ることはありません。私はこれを呼び出さず ->Clear()、代わりsomeobj = someobj.destroy();にJSで修正しました。

しかし、ここが面白いところです。何度も実行した後、コンピューター全体が狂ってしまいました。エクスプローラー ウィンドウのフォントが失われ、ウィンドウの装飾が失われ、タスクバーのシステム時間が消え、スタート メニューにアイコンではなく暗い四角形が表示されます。あなたはそれに名前を付けます。

なぜこれが起こったのですか?そして、代わりに呼び出し元のオブジェクトを null に設定するにはどうすればよいでしょうか?

4

0 に答える 0