摧毁来电者

时间:2012-06-24 15:43:15

标签: javascript c++ v8

v8::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()来修复此问题,而是在JS中执行someobj = someobj.destroy();

但这是有趣的部分。多次运行后,整台电脑都疯了。资源管理器窗口丢失字体,失去窗口装饰,任务栏中的系统时间消失,开始菜单显示黑色矩形而不是图标。你的名字。

为什么会这样?我怎么把调用对象设置为null呢?

0 个答案:

没有答案