4

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または複製されたハンドルへのアクセスは失敗する必要があります。

現在、ラップされたC ++オブジェクトを無効としてマークし、すべてのメソッド呼び出しで有効性を確認する必要があります。これを行う唯一の方法ですか、それともハンドルを無効としてマークする方法はありますか?

4

1 に答える 1

1

頭に浮かぶ唯一の方法は、呼び出されたときにエラーを発生させる追加の関数を用意することです。win次に、「.close」を呼び出すと、オブジェクトのプロトタイプ バージョンよりも優先されるプロパティを作成できます。

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 に答える