2015-05-31 88 views
1

說我要聲明指針數組特定對象像銷燬對象指針數組

Object *objects = new Object[size]; 

,然後一些新的對象添加到我的動態分配的數組

for (int i = 0; i < size; i++){ 

    Object* obj = new obj; 
    objects[i] = *obj; 

} 

是隻需在陣列上調用delete[]即可釋放所有內存,還是必須先遍歷數組,然後在每個對象上調用delete?或者這在實踐中是愚蠢的嗎?

+3

使用std :: vector。 –

+0

你沒有聲明一個指針數組。你真的想申報嗎? – juanchopanza

回答

3

首先,你必須按照解除分配的順序進行分配。

所以次數new,很多時候delete,同樣的次數new [],很多時候delete []


// Assuming objects as array of pointers [ Object **objects ] 
for (int i = 0; i < size; i++) 
{ 
    delete objects[i] ; 
} 

delete [] objects; 

而且你正確分配應該去:

Object **objects= new Object*[size]; 
for (int i = 0; i < size; i++) { 
    objects[i] = new Object; 
} 

另外,你應該使用智能指針std::unique_ptr對於無憂無慮的內存管理

std::vector< std::unique_ptr<Object> > objects ;

5

你總是需要delete你在某種程度上new的一切。這意味着,您需要在每次迭代中使用delete obj以避免泄漏。請注意,你永遠不會真的存儲Objectobj點,但它的副本。

你這樣做的方式知道是非常不尋常的,反正也不是很方便:因爲new Objects[size]已經默認構建了你的Objects,所以你顯示的循環沒有任何用處。特別是,它不添加任何元素,它們已經在那裏。你可以把它留下。如果您想更改數組的內容,例如做多的初始化,你的循環通常會看起來更像這個

for (int i = 0; i < size; i++){ 
    objects[i] = newValue;  
} 

記住,Objectsnew Objects[size]之後已經在那裏!

在實踐中,你會成爲一個

std::vector<Object> objects(size); 

更好(或者,如果上面不適合您的用例,一個

std::vector<std::unique_ptr<Object>> objects(size); 

,但我覺得這不太可能)。要詳細瞭解std::vector可以做什麼以及如何使用它,請閱讀the documentation。可能對你最重要的是:你可以像數組一樣索引它。

1
  1. 你存儲的對象,而不是指向對象的數組。這意味着當你刪除陣列並且內存會泄漏時它們不會被刪除。
  2. 如果你想存儲指向你的數組中的對象的指針,那麼你需要聲明它爲Object **objects = new Object *[size];然後你將不得不刪除數組中的所有指針。

所以更好的代碼如下:

//Allocation: 
Object **objects = new Object *[size]; 
for (int i = 0; i < size; i++){ 
    objects[i] = new Object; 
} 

//Deletion 
for (int i = 0; i < size; i++){ 
    delete objects[i]; 
} 
delete [] objects; 

一個更好的解決辦法是使用矢量和智能指針,然後你不需要刪除代碼的。

//Allocation: 
vector<unique_ptr<Object>> objects; 
for (int i = 0; i < size; i++){ 
    objects.push_back(make_unique(new Object)); 
} 

//Deletion 
//Hey where did all the code go.