delete плохо работает
От: 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 плохо работает
От: WolfHound  
Дата: 24.06.04 17:29
Оценка:
Здравствуйте, 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 плохо работает
От: WolfHound  
Дата: 24.06.04 17:32
Оценка:
Здравствуйте, 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 плохо работает
От: MaximE Великобритания  
Дата: 24.06.04 20:35
Оценка: 4 (1)
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 плохо работает
От: Шахтер Интернет  
Дата: 25.06.04 23:44
Оценка: 10 (1)
Здравствуйте, 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. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.