由于@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