繁体   English   中英

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

[英]How to deallocate a int*** in c++

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

你只需要反转你的动作(除了填充数组)

for(int i =0; i<xSize; i++)
{
    for(int j =0; j<ySize; j++)
    {
        delete[] volume[i][j];
    }
    delete[] volume[i];
}
delete[] volume;

如果可以,请首先避免手动动态内存管理。 例如,使用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是一种方便的替代方案。

您需要以与上面相同的方式递归遍历结构的所有级别(除了最里面的级别),并且与它们的分配相比以相反的顺序delete每个元素:

for(int i =0; i<xSize; i++)
{
    for(int j =0; j<ySize; j++)
    {
        delete[] volume[i][j];
    }
    delete[] volume[i];
}
delete[] volume;

相反。

你需要相同的循环结构,但是对于每个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;

简单 - 只需反向执行步骤即删除所有已创建的volume[i][j]然后为所有i值的volume[i]然后是音量。

这有点像丢失你的钥匙 - 你只需要追溯你的步骤!

一般规则是这样的:你需要为每个new[]设置一个匹配的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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM