如何在c ++中解除分配int ***

时间:2011-09-14 18:24:50

标签: c++ pointers multidimensional-array

如何在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;
            }
        }
    }

6 个答案:

答案 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**[]xSizenew 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}}