Освобождение 3-мерного массива



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



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;


?



Я знаю, что они должны идти в обратном порядке, но я не уверен, что делаю это правильно ... Кажется ли это правильным?
541   5  

5 ответов:

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

Храните указатель GLfloat и размеры как члены вашего класса:

GLfloat *tgrid;
int nx, ny, nz;

В функции initlaization:

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 - это только плоский массив.

Да. (Что еще я должен сказать?)

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

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

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

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

Comments

    Ничего не найдено.