2012-02-27 99 views
4

删除了暴露给v8的C++对象时,如何使可能指向此对象的句柄无效。使指向已删除的C++对象的句柄无效

我正在使用v8作为更大应用程序的脚本接口。使用节点的ObjectWrap类,在v8中打包和访问较大应用程序中的对象。

问题是,包装对象的生命周期是有限的。如果,在JavaScript中,我执行类似:

var win = app.getWindow(); 
win.close(); // The C++ object that win references goes away 
console.log(win.width()); // This should fail. 

我希望它表现得就像评论说。在win.close()(或者其他一些事件可能在JS控制之外)之后,任何对获胜或重复句柄的访问都需要失败。

目前,我必须将包装的C++对象标记为无效,并检查每个方法调用的有效性。这是做到这一点的唯一方法吗,还是有办法将手柄标记为不再有效?

回答

1

想到的唯一方法就是有一个额外的函数,在调用时给出一个错误。然后,当您调用'.close'时,您可以在您的win上创建优先于对象原型版本的属性。

function closedError() { 
    return new Error("Window Closed"); 
} 

win.close = function() { 
    this.width = closedError; 
    this.otherfunc = closedError; 
}; 

我目前没有编译器,但我想象的是C++中的这样的东西。

static Handle<Value> Close(const Arguments& args) { 
    HandleScope scope; 
    NODE_SET_METHOD(args.This(), "width", Window::Width); 
    NODE_SET_METHOD(args.This(), "otherfunc", Window::OtherFunc); 
} 
+0

有趣的可能的解决方案。可以很容易地编写一个函数,通过将所有方法设置为错误方法来“销毁”句柄。 – aughey 2012-02-29 05:21:28

+0

检查每个功能似乎并不复杂。也就是说,如果你制作了一个宏,那么在每个函数的顶部贴一个检查也很容易。 – loganfsmyth 2012-02-29 05:40:10