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

时间:2012-02-27 20:46:59

标签: node.js v8 embedded-v8

当删除暴露给v8的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控件之外),对win或duplicated句柄的任何访问都需要失败。

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

1 个答案:

答案 0 :(得分: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);
}