三维数组的重新分配

时间:2011-09-16 03:49:39

标签: c++ arrays memory multidimensional-array memory-management

我正在创建一个这样的三维数组:

GLfloat ***tgrid;
//other code in between here
tgrid = new GLfloat**[nx];
for(int i = 0; i < nx; i++)
{
    tgrid[i] = new GLfloat*[ny];
    for(int j = 0; j < ny; j++)
    {
        tgrid[i][j] = new GLfloat[nz];
    }
}

这是否意味着我应该像这样释放内存:

for(int i = 0; i < nx; i++)
{
    for(int j = 0; j < ny; j++)
    {
        delete [] tgrid[i][j];
    }
    delete [] tgrid[i];
}
delete [] tgrid;

我知道他们应该按“反向”顺序进行,但我不确定我做得对......这看起来是否正确?

5 个答案:

答案 0 :(得分:3)

由于我的答案也是肯定的,我将以K-ballo的答案为例,介绍如何使用平面阵列存储一组多维数据:

将GLfloat指针和尺寸存储为您的类的成员:

GLfloat *tgrid;
int nx, ny, nz;

在初始化功能中:

void CreateGrid(int x, int y, int z)
{
    nx = x;
    ny = y;
    nz = z;
    tgrid = new GLfloat[nx*ny*nz];
}

您需要一致地定义索引方案以进行正确的读写:

GLfloat GetValueAt(int x, int y, int z)
{

    return tgrid[ (nx*ny*z) + (nx*y) + x ]; 

}

void SetValueAt(int x, int y, int z, GLfloat value)
{

    tgrid[ (nx*ny*z) + (nx*y) + x ] = value;

}

由于tgrid只是一个扁平数组,所以删除也很简单。

答案 1 :(得分:2)

是。 (我还想说什么)

答案 2 :(得分:1)

是的,您必须以相反的顺序解除分配。否则,在释放它们之前,你将松开内部指针。

是否有任何理由不能使用平面数组来表示3dimensional数组?也许是Boost.MultiArray,它处理多个维度并允许访问底层(平面)数组?

答案 3 :(得分:0)

或者,您可以使用std::vector而不用担心newdelete

std::vector<std::vector<std::vector<GLfloat> > > tgrid;
tgrid.resize(nx);
for(int i = 0; i < nx; i++) {
  tgrid[i].resize(ny);
  for(int j = 0; j < ny; i++) {
    tgrid[i][j].resize(nz);
  }
}

答案 4 :(得分:0)

您还可以为std :: vector

实现包装类