【问题标题】:How to deallocate a int*** in c++如何在 C++ 中释放一个 int***
【发布时间】:2011-11-17 06:42:51
【问题描述】:

如何在 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循环和delete每个new你所做的。
  • @Als: delete[] 每个new[]
  • @Benoit:啊,当然,delete 每个newdelete[] 每个new[]
  • 我真的必须推荐vector>>。或者一个 int* 的包装类,比如 boost::multi_array

标签: c++ pointers multidimensional-array


【解决方案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;

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      反过来。

      您需要相同的循环结构,但对于每个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】:

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

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

        【讨论】:

          【解决方案5】:

          如果可以,请首先避免手动动态内存管理。例如。使用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)));
          

          正如 cmets 中所指出的,Boost.MultiArray 是一个方便的替代方案。

          【讨论】:

          • 我不是在寻找替代品。
          【解决方案6】:

          一般规则是:每个new[] 都需要一个匹配的delete[]。您看到有一个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;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-04-22
            • 2021-03-15
            • 2013-11-15
            • 1970-01-01
            • 2023-03-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多