Освобождение 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;
?
Я знаю, что они должны идти в обратном порядке, но я не уверен, что делаю это правильно ... Кажется ли это правильным?
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); } }
Comments