由於@aschepler在評論中提到,這取決於內存如何分配。我認爲你可能分配這樣的記憶:
int*** t = new int**[dim1];
for (int i = 0; i < dim1; i++) {
t[i] = new int*[dim2];
for (int j = 0; j < dim2; j++) {
t[i][j] = new int[dim3];
}
}
如果以這種方式分配的內存,那麼內存看起來是這樣的:
[ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
+---> [ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
| [ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
|
t ---> [ 0 ] [ 1 ]
|
| [ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
+---> [ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
現在,假設你只寫
delete[] t;
如果你這樣做,那麼內存將是這樣的:
[ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
t ---> xxx
[ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
換句話說,你已經收回了一個數組,但是你已經泄漏了大部分內存。哎呀!另一方面,如果您使用for循環版本的刪除代碼,則最終會收回所有內存,因爲您已遍歷所有指針並釋放了分配的每個數組。
一般來說,每個分配都應該有一個匹配的解除分配,所以如果你多次撥打new[]
,你需要撥打相同的次數delete[]
。
正如一些評論指出的那樣,管理3D陣列可能比使用int ***
更好。 C++的一般趨勢是儘可能使用對象自動管理內存。考慮查看Boost multi_array
類型,或者考慮編寫圍繞以行優先順序存儲條目的std::vector
的包裝。
答案取決於記憶是如何在第一時間進行分配。 – aschepler
偏題:'int ***'不會是3D數組。它將是一個數組數組。這些可能會有非常糟糕的緩存性能。如果你只是把東西敲出來,好吧。如果您需要速度,請考慮一維數組和一個使其看起來像3D數組的包裝。 – user4581301
爲什麼不首先使用'std :: vector'? – Jarod42