Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Удаление массива указателей


Автор: Svia 11.6.2009, 14:33
Что-то не могу сообразить, что к чему:
Код

cairo_surface_t* temp_surfaces[ 3 ];  //Here cairo_surface_t* is equal to int*
LoadSomethingToArray2x(path, temp_surfaces)
delete[] temp_surfaces;   //HERE!!! warning C4154: deletion of an array expression; conversion to pointer supplied


До этого считал, что инструкция delete[] вызовет оператор delete для каждого объекта в последовательности. Т.е. в моем случае эквивалентно:
Код

delete temp_surfaces[0];
delete temp_surfaces[1];
delete temp_surfaces[2];


С другой стороны, пока писал, пришла в голову мысль, что инструкция delete[] ArrayOfObjects вызовет фактически
Код

delete &ArrayOfObject[i]


В итоге, тогда относительно изначального вопроса я получаю для каждого элемента последовательности удаление указателя на указатель, так?

Вообще, я немного запутался в этом вопросе.

Автор: gosn1ck 11.6.2009, 14:50
Код

for (int i =0; i < m; i++)
delete pi[i]; // удаляем элементы - указатели
detele pi; // удаляем указатель на массив

Автор: zim22 11.6.2009, 15:01
Цитата(Svia @  11.6.2009,  14:33 Найти цитируемый пост)
cairo_surface_t* temp_surfaces[ 3 ];

Цитата(Svia @  11.6.2009,  14:33 Найти цитируемый пост)
delete[] temp_surfaces; 

 temp_surfaces - массив из 3 указателей на тип cairo_surface_t
память под него выделяется в стеке, но не из динамической памяти.
какое право вы имеет писать 
Код

delete[] temp_surfaces

если вы не создавали его с помощью new?

Автор: andrew_121 11.6.2009, 15:39
Svia, Читай в доках про эту функцию.
Цитата(Svia @  11.6.2009,  14:33 Найти цитируемый пост)
LoadSomethingToArray2x(path, temp_surfaces)



Похоже она работает temp_surfaces. Но раз ты память не выделяешь, значит должна быть функция которая это делает. А возможно и нет.

Автор: Svia 11.6.2009, 21:28
Цитата(zim22 @ 11.6.2009,  15:01)
Цитата(Svia @  11.6.2009,  14:33 Найти цитируемый пост)
cairo_surface_t* temp_surfaces[ 3 ];

Цитата(Svia @  11.6.2009,  14:33 Найти цитируемый пост)
delete[] temp_surfaces; 

 temp_surfaces - массив из 3 указателей на тип cairo_surface_t
память под него выделяется в стеке, но не из динамической памяти.
какое право вы имеет писать 
Код

delete[] temp_surfaces

если вы не создавали его с помощью new?

Функция LoadSomethingToArray2x создает наполнение массива. Это не очень очевидно из первого поста, но это так =)

Добавлено через 6 минут и 45 секунд
Цитата(andrew_121 @ 11.6.2009,  15:39)
Svia, Читай в доках про эту функцию.
Цитата(Svia @  11.6.2009,  14:33 Найти цитируемый пост)
LoadSomethingToArray2x(path, temp_surfaces)



Похоже она работает temp_surfaces. Но раз ты память не выделяешь, значит должна быть функция которая это делает. А возможно и нет.

Она выделяет, это моя функция =)
То, что выделит - это факт. Интесно как удалять.

Автор: andrew_121 11.6.2009, 22:06
Цитата(Svia @  11.6.2009,  21:28 Найти цитируемый пост)
Интесно как удалять. 

Покажи как выделяешь.

Автор: zim22 12.6.2009, 08:16
Цитата(Svia @  11.6.2009,  21:28 Найти цитируемый пост)
То, что выделит - это факт. Интесно как удалять.


Цитата(Svia @  11.6.2009,  21:28 Найти цитируемый пост)
Функция LoadSomethingToArray2x создает наполнение массива

есть разница между заполнением массива (присваиванием) и динамеческим созданием массива.
если вы имеете ввиду, что вы присваиваете индексам массива адреса памяти, возвращённые new, то и удаляйте указатели по индексам, а не сам массив.
Код

delete temp_surfaces[0]; 
delete temp_surfaces[1]; 
delete temp_surfaces[2]; 

Автор: Svia 12.6.2009, 11:10
Цитата(zim22 @ 12.6.2009,  08:16)
Цитата(Svia @  11.6.2009,  21:28 Найти цитируемый пост)
То, что выделит - это факт. Интесно как удалять.


Цитата(Svia @  11.6.2009,  21:28 Найти цитируемый пост)
Функция LoadSomethingToArray2x создает наполнение массива

есть разница между заполнением массива (присваиванием) и динамеческим созданием массива.
если вы имеете ввиду, что вы присваиваете индексам массива адреса памяти, возвращённые new, то и удаляйте указатели по индексам, а не сам массив.
Код

delete temp_surfaces[0]; 
delete temp_surfaces[1]; 
delete temp_surfaces[2]; 

Ага, вроде встало все на свои месте.
* Удалять сам массив нельзя, т.к. он создан на стеке, с этим разобрался.
* delete[] array вовсе не эквивалентно вызову нескольких delete для каждого элемента массива
* Если я верно понял, то delete[] скорее вызоветдеструктор по умолчанию для каждого из объектов, но не для указателей.

Вроде так.

Автор: azesmcar 12.6.2009, 11:46
Цитата(Svia @  12.6.2009,  11:10 Найти цитируемый пост)
* delete[] array вовсе не эквивалентно вызову нескольких delete для каждого элемента 
массива

Код

void* operator new(std::size_t) throw(std::bad_alloc);
void* operator new[](std::size_t) throw(std::bad_alloc);
void operator delete(void*) throw();
void operator delete[](void*) throw();

это разные операторы

new T вызывает operator new(sizeof(T)),
new T[5] вызывает operator new[](sizeof(T)*5+x)

если память была выделена с помощью operator new[], то и освобождаться она должна соответствующим оператором delete[].

Цитата(Svia @  12.6.2009,  11:10 Найти цитируемый пост)
* Если я верно понял, то delete[] скорее вызоветдеструктор по умолчанию для каждого из объектов, но не для указателей.

где все этого нахватались? Какой деструктор по умолчанию? вы знаете и другие деструкторы? Деструктор один единственный на весь класс.

Автор: andrew_121 12.6.2009, 12:29
Цитата(azesmcar @  12.6.2009,  11:46 Найти цитируемый пост)
new T[5] вызывает operator new[](sizeof(T)*5+x)

А кто такой х ?

Автор: azesmcar 12.6.2009, 15:05
Цитата(andrew_121 @  12.6.2009,  12:29 Найти цитируемый пост)
А кто такой х ? 

неизвестная smile 
оверхед smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)