2015-05-25 108 views
0

比方說C++刪除指向包含另一個指針對象

class A { 
    A* array; 
public: 
    A(){ 
    array= new A [4]; 
    } 

    ~A(){ 
    delete array; 
    } 
} 

我們如何釋放一個對象,如果我們創建堆這樣一個對象像

A* object_ptr =new A(); 

我有點困惑於釋放指向包含另一個指針的對象的指針.....

回答

0

有兩件事要注意。

  1. 刪除數組時,應該使用[]。例如:delete [] array;
  2. 刪除指針時,分配的對象的析構函數將被調用。你會從你的代碼中調用:delete object_ptr;來刪除你的指針。

另一個需要注意的重點是複製對象時發生的情況。如果你的對象獲得副本,你會遇到問題,一個析構函數從另一個對象下刪除指針。這就是爲什麼shared_ptr是原始指針的不錯選擇(關於如何使用shared_ptr,請參閱this question)。

+0

如果我將object_ptr賦值給一個新指針,會導致同樣的問題嗎? – GalaxyVintage

+0

是的。如果你寫:'A * a = new A(); A * b = a;刪除一個;然後''''''''''內部'陣列'也將被刪除。 –

+0

嗯......如果一個對象是由棧中創建的一個方法創建的,那麼堆中的內存是否會被釋放? – GalaxyVintage

5

調用

delete object_ptr; 

A* object_ptr =new A(); 

將調用A的析構函數object_ptr指向。這意味着,如果您修正錯誤

~A(){ 
    delete array; 
} 

~A(){ 
    delete[] array; 
} 

你的代碼會被罰款和內部指針被正確地釋放。

順便說一句,你真的應該使用std::vector而不是new[]。它會讓你的生活變得更加輕鬆。如果您堅持要求new[],請閱讀The Rule of Three

+0

和'std :: unique_ptr'(如果有的話)而不是'純粹的'指針 – Hcorg

+0

@Hcorg個人而言,我從來沒有遇到過一個指針成員是個好主意的問題。但一般來說,*「沒有擁有指針」*當然是很好的建議。 –

相關問題