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