Распределение 3-х мерного массива - PullRequest
2 голосов
/ 16 сентября 2011

Я создаю трехмерный массив, подобный этому:

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;

?

Iзнаю, что они должны идти в "обратном" порядке, но я не уверен, что я делаю это правильно ... Это кажется правильным?

Ответы [ 5 ]

3 голосов
/ 16 сентября 2011

Поскольку мой ответ также положительный, я последую за ответом К-балла с минимальным примером того, как использовать плоский массив для хранения набора многомерных данных:

Сохранение указателя 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 - это только плоский массив.

2 голосов
/ 16 сентября 2011

Да. (Что еще я хотел сказать)

1 голос
/ 16 сентября 2011

Да, вы должны освободить их в обратном порядке.В противном случае вы потеряете внутренние указатели перед их освобождением.

Есть ли причина, по которой вы не можете использовать плоский массив для представления вашего трехмерного массива?Возможно, Boost.MultiArray, который обрабатывает несколько измерений и предоставляет доступ к базовому (плоскому) массиву?

0 голосов
/ 16 сентября 2011

Также вы можете реализовать класс-оболочку для std :: vector

0 голосов
/ 16 сентября 2011

Или вы можете использовать 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);
  }
}
...