class A {
A* array;
public:
A(){
array= new A [4];
}
~A(){
delete array;
}
}
我們如何釋放一個對象,如果我們創建堆這樣一個對象像
A* object_ptr =new A();
我有點困惑於釋放指向包含另一個指針的對象的指針.....
class A {
A* array;
public:
A(){
array= new A [4];
}
~A(){
delete array;
}
}
我們如何釋放一個對象,如果我們創建堆這樣一個對象像
A* object_ptr =new A();
我有點困惑於釋放指向包含另一個指針的對象的指針.....
有兩件事要注意。
[]
。例如:delete [] array;
delete object_ptr;
來刪除你的指針。另一個需要注意的重點是複製對象時發生的情況。如果你的對象獲得副本,你會遇到問題,一個析構函數從另一個對象下刪除指針。這就是爲什麼shared_ptr
是原始指針的不錯選擇(關於如何使用shared_ptr
,請參閱this question)。
當你的對象delete
被調用析構函數,這就是你需要擔心的。這裏更多的信息:Does delete call the destructor?
調用
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。
和'std :: unique_ptr'(如果有的話)而不是'純粹的'指針 – Hcorg
@Hcorg個人而言,我從來沒有遇到過一個指針成員是個好主意的問題。但一般來說,*「沒有擁有指針」*當然是很好的建議。 –
如果我將object_ptr賦值給一個新指針,會導致同樣的問題嗎? – GalaxyVintage
是的。如果你寫:'A * a = new A(); A * b = a;刪除一個;然後''''''''''內部'陣列'也將被刪除。 –
嗯......如果一個對象是由棧中創建的一個方法創建的,那麼堆中的內存是否會被釋放? – GalaxyVintage