0 c++ arrays pointers new-operator
我t动态创建了一个3D数组(t类型int***).现在我想删除它.
我遇到了两个建议:一个就是这样做
delete[] t;
Run Code Online (Sandbox Code Playgroud)
显然,它会删除所有内容.
另一种是做类似的事情
for(int i=0;i<3;i++)
{
for(int j=0;j<t1[i];j++)
{
delete[] t[i][j];//delete all 1D array
}
delete[] t[i];//delete all 2D array
}
delete[] t;//delete the 3D array
Run Code Online (Sandbox Code Playgroud)
(t1存储尺寸t[i]和t2尺寸t[i][j])
什么是最好的方法?
正如@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];
}
}
Run Code Online (Sandbox Code Playgroud)
如果以这种方式分配内存,那么内存看起来像这样:
[ 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 ]
Run Code Online (Sandbox Code Playgroud)
现在,假设你只是写作
delete[] t;
Run Code Online (Sandbox Code Playgroud)
如果你这样做,那么内存将如下所示:
[ 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 ]
Run Code Online (Sandbox Code Playgroud)
换句话说,你已经回收了其中一个数组,但是你已经泄露了大部分内存.哎呀!
另一方面,如果使用删除代码的for循环版本,则最终会回收所有内存,因为您已经浏览了所有指针并释放了每个分配的数组.
一般来说,每个分配都应该有一个匹配的释放,所以如果你new[]多次调用,你需要调用delete[]相同的次数.
正如一些评论所指出的那样,管理3D阵列可能比使用更好的方法int ***.C++的一般趋势是使用对象尽可能自动地管理内存.考虑查看Boost multi_array类型,或考虑围绕std::vector以行主顺序存储条目的包装器.