От:
esergey
Дата: 24.06.04 17:20
Оценка:
Выделяю память следующим образом для трехмерного массива
float *** ar;
ar=new float **[100];
for(int i=0;i<100;i++)
ar[i]=new float *[100];
for(int i=0;i<100;i++)
for(int z=0;z<100;z++)
ar[i][z]=new float [100];
Затем удаляю delete [] ar;
Не вся память очищается. Подскажите как правильно освобождать память?
Re: delete плохо работает
От:
MaxSem
Дата: 24.06.04 17:25
Оценка:
Здравствуйте, esergey, Вы писали:
E>Затем удаляю delete [] ar;
E>Не вся память очищается. Подскажите как правильно освобождать память?
На каждый вызов new должен приходиться свой delete.
В вашем случае:
for (int i=0;i<100;i++)
for (int z=0;z<100;z++)
delete ar[i][z];
ar=new float **[100];
for (int i=0;i<100;i++)
delete ar[i];
Re[2]: delete плохо работает
От:
MaxSem
Дата: 24.06.04 17:28
Оценка:
Чуть не забыл: и потом уж
delete ar;
Re: delete плохо работает
Здравствуйте, esergey, Вы писали:
E>Выделяю память следующим образом для трехмерного массива
E>float *** ar;
E>ar=new float **[100];
E>for (int i=0;i<100;i++)
E> ar[i]=new float *[100];
E>for (int i=0;i<100;i++)
E> for (int z=0;z<100;z++)
E> ar[i][z]=new float [100];
E>for (int i=0;i<100;i++)
E> for (int z=0;z<100;z++)
E> delete [] ar[i][z];
E>for (int i=0;i<100;i++)
E> delete [] ar[i];
E>delete [] ar;
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: delete плохо работает
Здравствуйте, MaxSem, Вы писали:
Для new[] нужно вызывать delete[] инече не определенное поведение.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: delete плохо работает
От:
_AK_
Дата: 24.06.04 17:55
Оценка:
Здравствуйте, esergey, Вы писали:
E>Выделяю память следующим образом для трехмерного массива
E>float *** ar;
E>ar=new float **[100];
E>for(int i=0;i<100;i++)
E> ar[i]=new float *[100];
E>for(int i=0;i<100;i++)
E> for(int z=0;z<100;z++)
E> ar[i][z]=new float [100];
E>Затем удаляю delete [] ar;
E>Не вся память очищается. Подскажите как правильно освобождать память?
Какой садомазохизм... Может стоить посмотреть в сторону boost::multiarray?
Re: delete плохо работает
esergey wrote:
> Выделяю память следующим образом для трехмерного массива
>
> float *** ar;
(1) > ar=new float **[100];
> for(int i=0;i<100;i++)
(2) > ar
=new float *[100];
>
> for(int i=0;i<100;i++)
> for(int z=0;z<100;z++)
(3) > ar[i][z]=new float [100];
>
> Затем удаляю delete [] ar;
>
> Не вся память очищается. Подскажите как правильно освобождать память?
У тебя ошибка в том, что ты удалил память, выделенную только в 1, хотя выделяешь ты еще и в п.2 и п.3.
Есть простой способ избавиться от мороки с кучей выделенний/освобождений для n — мерных массивов — рассматривать такой массив как одномерный массив. Тебе лишь придется пожертвовать формой записи для доступа к элементам, в твоем случае array[x][y][z] заменить ее на array[x + y * y_dimension + z * z_dimension].
Это будет выглядеть так:
size_t const x_dimension = 100;
size_t const y_dimension = 100;
size_t const z_dimension = 100;
inline float & at(float * array, size_t x, size_t y, size_t z)
{
return array[x + y * y_dimension + z * z_dimension];
}
inline float * alloc_array()
{
return new float [x_dimension * y_dimension * z_dimension]
}
inline void free_array(float * array)
{
delete [] array;
}
void f()
{
float * array = alloc_array();
// занулим массив
for (size_t z = 0; z < z_dimension; ++z)
for (size_t y = 0; y < y_dimension; ++y)
for (size_t x = 0; x < x_dimension; ++x)
at(array, x, y, z) = 0;
// ...
frea_array(array);
}
--
[i]Maxim Yegorushkin Posted via RSDN NNTP Server 1.9 beta
Re[2]: delete плохо работает
От:
MaximE
Дата: 25.06.04 04:33
Оценка:
+1
MaximE wrote:
[]
> > inline float & at(float * array, size_t x, size_t y, size_t z)
> {
> return array[x + y * y_dimension + z * z_dimension];
> }
>
Конечно же:
return array[x + y * y_dimension + z * z_dimension * y_dimension];
--
Maxim Yegorushkin Posted via RSDN NNTP Server 1.9 beta
Re[2]: delete плохо работает
Здравствуйте, MaximE, Вы писали:
...
Я не понимаю. Если у вас трехмерный массив с известными в компил-тиме размерностями, то не проще ли засунуть его в структуру.
struct Array3D
{
static size_t const x_dimension = 100;
static size_t const y_dimension = 100;
static size_t const z_dimension = 100;
float array[x_dimension][y_dimension][z_dimension];
};
Array3D *a3D=new Array3D;
...
delete a3D;
... << RSDN@Home 1.1.0 stable >>
В XXI век с
CCore .
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: delete плохо работает
От:
MaximE
Дата: 26.06.04 22:22
Оценка:
Шахтер wrote:
> Я не понимаю. Если у вас трехмерный массив с известными в компил-тиме размерностями, то не проще ли засунуть его в структуру.
>
> > struct Array3D
> {
> static size_t const x_dimension = 100;
> static size_t const y_dimension = 100;
> static size_t const z_dimension = 100;
>
> float array[x_dimension][y_dimension][z_dimension];
> };
>
>
> > Array3D *a3D=new Array3D;
>
> ...
>
> delete a3D;
>
А можно и вообще никуда не засовывать:
float (*const array)[100][100](new float [100][100][100]);
--
Maxim Yegorushkin Posted via RSDN NNTP Server 1.9 beta
Re[4]: delete плохо работает
От:
Шахтер
Дата: 26.06.04 22:45
Оценка:
Здравствуйте, MaximE, Вы писали:
ME>А можно и вообще никуда не засовывать:
ME>ME>float (*const array)[100][100](new float [100][100][100]);
ME>
ME>--
ME>Maxim Yegorushkin
Уж очень страшное выражение.
... << RSDN@Home 1.1.0 stable >>
В XXI век с
CCore .
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить