4

当一个暴露给 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 或重复句柄的访问都需要失败。

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

4

1 回答 1

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);
}
于 2012-02-28T00:14:10.413 回答