2010-05-03 110 views
4

看看下面的代碼,請:測試,如果對象被刪除

class Node 
{ 
private: 
    double x, y; 
public: 
    Node (double xx, double yy): x(xx), y(yy){} 
}; 

int main() 
{ 
    Node *n1 = new Node(1,1); 
    Node *n2 = n1; 

    delete n2; 
    n2 = NULL; 

    if (n1 != NULL) //Bad test 
    { 
    delete n1; //throw an exception 
    } 
} 

有兩個指針N1,N2指向同一個對象。我想檢測是否使用n1指針測試刪除了n2。但是這個測試會導致異常。

有什麼辦法如何確定對象是否被刪除(或未被刪除)使用n1指針?

回答

4

否。代碼中沒有任何方法可以達到n1指針,並在指向對象被銷燬時更改指針。

爲了達到這個目的,Node必須(例如)維護一個指向它的所有指針的列表,並且每次複製指針值時都必須手動註冊(即調用一個方法)。合作會很痛苦。

11

據我所知,處理這種情況的典型方法是使用引用計數的指針,例如COM的方式。在Boost中,有shared_ptr模板類可以幫助(http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/shared_ptr.htm)。

+2

+1:boost :: shared_ptr真的很有效率。你甚至不需要自己調用delete,並且可以爲所指向的值提供你自己的析構函數。 – ereOn 2010-05-03 12:50:30

0

當你有一個對象時,它會在內存中的某個地方。這是n1n2的值。當你刪除對象時,通過釋放對象使用的內存,內存無效。所以你永遠不能訪問任何n1點,如果它被刪除。

我建議創建一個包裝對象,它包含一個計數器和一個指向該對象的指針。當你想指向實際的對象時,你必須指向包裝器,而當你想刪除對象時,你實際上調用了一個包裝器上的方法:

如果你想指向對象,你應該增加包裝器的計數器,並指向包裝器。如果你想刪除對象,你應該減少計數器並將指向包裝器的指針設置爲null。如果包裝器的計數器達到零,則可以安全地刪除實際對象,然後刪除包裝器。

+1

'我建議創建一個包裝對象,它包含一個計數器和一個指向該對象的指針。「 - 這稱爲共享指針,爲什麼重新發明輪子? – 2012-12-07 08:50:16

相關問題