如何在c ++中释放这种类型的3D数组?我有一个有一个int ***卷作为成员的类,我用这种方式填充..
volume = new int**[xSize];
for(int i =0; i<xSize; i++)
{
volume[i] = new int*[ySize];
for(int j =0; j<ySize; j++)
{
volume[i][j] = new int[zSize];
for(int k = 0; k<zSize;k++)
{
volume[i][j][k] = 0;
}
}
}
答案 0 :(得分:6)
您只需撤消您的操作(除了填充数组)
for(int i =0; i<xSize; i++)
{
for(int j =0; j<ySize; j++)
{
delete[] volume[i][j];
}
delete[] volume[i];
}
delete[] volume;
答案 1 :(得分:2)
如果可以,请首先避免手动动态内存管理。例如。使用std::vector
:
typedef std::vector<int> Vec1D;
typedef std::vector<Vec1D> Vec2D;
typedef std::vector<Vec2D> Vec3D;
Vec3D volume(xSize, Vec2D(ySize, Vec1D(zSize, 0)));
正如评论中所指出的,Boost.MultiArray是一种方便的选择。
答案 2 :(得分:1)
你需要以与上面相同的方式递归遍历结构的所有级别(除了最里层),并且每个元素的反序与它们的分配相比,delete
:
for(int i =0; i<xSize; i++)
{
for(int j =0; j<ySize; j++)
{
delete[] volume[i][j];
}
delete[] volume[i];
}
delete[] volume;
答案 3 :(得分:1)
相反。
你需要相同的循环结构,但是对于每个new[]
,你需要一个delete[]
,现在嵌套的东西必须在之前发生。
所以:
int **x = new int*[M];
for (i = 0; i < M; i++)
{
x[i] = new int[N];
}
变为:
for (i = 0; i < M; i++)
{
delete [] x[i];
}
delete [] x;
答案 4 :(得分:0)
简单 - 只需反向执行步骤即可
即删除您创建的所有volume[i][j]
然后volume[i]
获取所有i
个值
然后是音量。
这有点像丢失你的钥匙 - 你只需要追溯你的步骤!
答案 5 :(得分:0)
一般规则是:您需要为每个delete[]
分配一个匹配new[]
。您看到有一个new int**[]
,xSize
个new int*[]
个ySize
个实例以及new int[]
for(int i =0; i<xSize; i++)
{
for(int j =0; j<ySize; j++)
{
delete[] volume[i][j];
}
delete volume[i];
}
delete[] volume;
个实例。
所以,你可以将它们全部释放出来:
{{1}}