2010-11-16 105 views
25

我有這個在我的代碼:刪除指向指針(如數組的數組)

double** desc = new double* [size_out]; 
for (int i = 0; i < size_out; i++) 
    desc[i] = new double [size_in]; 

如何刪除這個desc

我應該做的:

delete [] desc; 

for (int i=0; i<size_out; i++) 
    delete [] desc[i]; 
delete [] desc; 

for (int i=0; i<size_out; i++) 
    delete [] desc[i]; 
delete desc; 

+0

看一看這裏:http://stackoverflow.com/questions/340943/c-multi-dimensional-arrays-on-the-heap – 2010-11-16 12:17:26

回答

16

簡單的規律可循:

  • 每個分配,必須有一個釋放(EX1因此錯誤)
  • 什麼用new分配應使用delete中解放出來,用new[]應該被釋放使用delete[]和使用malloc應使用free被釋放(EX3因此錯誤)

結論,EX2是OK。

18

您的刪除應該反映您的分配。

由於您使用new []分配外部數組,並且使用new [](在循環中)分配內部數組,所以同樣也要刪除。那就是:你的第二個解決方案是正確的; delete []內部數組在一個循環中,最後通過delete []也是外部數組。

這就是說,在C()更好的解決方案++是使用嵌套std::vector

// Declaration and initialization: 
vector<vector<double> > desc(size_out, vector<double>(size_in)); 

// No deletion! 
+1

+1爲載體的解決方案。 – 2010-11-16 12:17:58

+0

謝謝,但不幸的是我需要使用這雙** – yelo3 2010-11-16 12:18:14

4

我將針對分配每個陣列做

for (int i=0; i<size_out; i++) 
    delete [] desc[i]; 
delete [] desc; 

new [],你有相應的delete []

編輯:和Rupdolph說:停止使用C數組,並開始使用std::vector。你會有(我的意思是百倍!)更少的錯誤。

5

解決方案2是正確的:每個單元指向一個動態分配的數組,應該使用delete[]刪除。最後, desc陣列本身應該使用delete[]刪除。

紅利解決方案4:避免使用數組並切換到std::vector<std::vector<double> >

17

你的代碼不應該編譯。數組new表達式的類型是指向正在創建的數組元素類型的指針(該值是指向分配數組的第一個元素的指針)。

所以new double**[size_out]類型是double ***

每當你使用新的陣列形式,必須使用刪除的陣列形式,即使你只分配一個大小的數組。

double*** desc = new double**[size_out]; 
for (int i=0; i<size_out; i++) 
    desc[i] = new double*[size_in]; 


for (int i=0; i<size_out; i++) 
    delete[] desc[i]; 

delete[] desc; 

請注意,您還沒有分配任何double,公正的指針。

你真的想這樣呢?

double** desc = new double*[size_out]; 
for (int i=0; i<size_out; i++) 
    desc[i] = new double[size_in]; 

for (int i=0; i<size_out; i++) 
    delete[] desc[i]; 

delete[] desc; 
+0

+1指出類型不匹配問題 – 2010-11-16 12:56:18