2012-02-27 41 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