2012-12-04 228 views
0

我有這樣的代碼來分配和初始化:C++刪除動態矩陣

nw = new int*[V]; 

for (w = 0; w < V; w++) { 

nw[w] = new int[K]; 

for (k = 0; k < K; k++) 

    nw[w][k] = 0; 
} 

,這釋放內存:

if (nw) { 
for (int w = 0; w < V; w++) { 
    if (nw[w]) 
delete nw[w];  
} 

程序編譯和運行,但是,當它嘗試釋放內存,失敗。 程序並不總是以相同的w值失敗。

任何想法?

+3

無關:刪除空指針沒有不良的副作用,所以檢查完全是多餘的和不必要的。 –

+0

但是如果nw = NULL,是「delete [] nw [w];」安全? – John

回答

6

new[]使用delete[],所以更改爲:

delete[] nw[w]; 

,記得delete[] nw;

注意的0到陣列中的每個int個人分配可以被替換爲:

nw[w] = new int[K](); // This value initializes the array, in this 
       //^^  case sets all values to zero. 

你能避免明確處理動態分配與std::vector<std::vector<int>>

std::vector<std::vector<int>> nw(V, std::vector<int>(K)); 
+0

我改爲: 刪除[] nw [w]; 並且錯誤仍在繼續。 我使調試和它崩潰。對於某些w的值運行良好,但不適用於其他 – user1705996

+0

@ user1705996,請參閱http://ideone.com/Ju5MvX。 'nw'是班級成員嗎?如果是這樣,它是_definitely_正在初始化? – hmjd

+0

nw是一個類的屬性: class model { public: ... int ** nw; ... } 我打印值和所有值都爲0 (一想,我不明白的是:例如:我執行它,它崩潰時,w的值爲30 ,如果我再次執行它,崩潰爲w的不同值,例如15或40) – user1705996

1

我認爲你的意思使用delete[],而不是delete

for (int w = 0; w < V; w++) 
    delete[] nw[w]; 
delete[] nw; 
+0

我改爲:delete [] nw [w];並且錯誤繼續。我做調試,它崩潰。對於某些w的值運行良好,但不適用於其他值 – user1705996