2013-10-22 119 views
1

我的問題來自this的答案。 在評論中他提到我應該以相反的順序刪除分配的動態二維數組。 但是我不明白爲什麼要這樣做。這裏是代碼:正確刪除二維數組?

//intialising array 
int size = 10000; 
double **array = new double[size]; 
for(int i = 0; i < size; i++) 
    array[i] = new double[size]; 

//conventional de-initialise 
for(int i = 0; i < size; i++) 
    delete[] array[i]; 
delete[] array; 

//reverse de-initialise 
for(int i = size - 1; size >= 0; i--)//notice reverse order here 
    delete[] array[i]; 
delete[] array; 

所以我的問題是,有兩個取消分配二維數組的方法之間有任何顯着差異?

+1

C++約定是以構造對象的順序相反的方式銷燬對象。但是,這個約定與動態分配的對象幾乎沒有關係,除了對象相互依賴的地方。 – jxh

+0

不(但你真的不應該做任何一個)。 –

+1

@Jerry你能告訴我爲什麼你說我不應該做? –

回答

0

在您的例子有沒有區別 - 您創建100K指針,然後爲每個分配內存。無論您如何分配/釋放內存並將其分配給指針數組,都無關緊要。

但是你的問題是爲什麼反向釋放在另一篇文章中,對面的例子它的事項 - 計數器變量被重用從去年分配對象倒計時到0,當新的內存分配失敗。如果釋放其他方向,則需要額外的變量:

try 
{ 
    array = new double*[size]; 

    // Don't shadow counter here. 
    for(counter = 0; counter < size; counter++) 
    { 
     array[counter] = new double[size]; 
    } 
} 
catch(std::bad_alloc) 
{ 
    // delete in reverse order to mimic other containers. 
    for(--counter; counter >= 0;--counter) 
    { 
     delete[] array[counter]; 
    } 

    delete[] array;