我正在创建一个这样的三维数组:
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;
我知道他们应该按“反向”顺序进行,但我不确定我做得对......这看起来是否正确?
答案 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
而不用担心new
或delete
:
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
实现包装类