使指向已删除的C ++对象的句柄无效

当暴露给v8的C ++对象被删除时,我怎样才能使可能指向这个对象的句柄失效。

我正在使用v8作为一个更大的应用程序的脚本接口。 更大的应用程序中的对象在v8中使用节点的ObjectWrap类进行封装和访问。

问题是,包装对象的生命周期是有限的。 如果在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控制之外),任何对win或者duplicate处理的访问都需要失败。

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

Solutions Collecting From Web of "使指向已删除的C ++对象的句柄无效"

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

 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); }