Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление массива указателей 
:(
    Опции темы
Svia
Дата 11.6.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Что-то не могу сообразить, что к чему:
Код

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]


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

Вообще, я немного запутался в этом вопросе.
PM MAIL   Вверх
gosn1ck
Дата 11.6.2009, 14:50 (ссылка)  | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



Код

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


Это сообщение отредактировал(а) gosn1ck - 11.6.2009, 14:50
PM MAIL ICQ   Вверх
zim22
Дата 11.6.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(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?



--------------------
PM MAIL   Вверх
andrew_121
Дата 11.6.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



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



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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Svia
Дата 11.6.2009, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Цитата(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. Но раз ты память не выделяешь, значит должна быть функция которая это делает. А возможно и нет.

Она выделяет, это моя функция =)
То, что выделит - это факт. Интесно как удалять.
PM MAIL   Вверх
andrew_121
Дата 11.6.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



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

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 12.6.2009, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(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]; 


Это сообщение отредактировал(а) zim22 - 12.6.2009, 08:17


--------------------
PM MAIL   Вверх
Svia
Дата 12.6.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Цитата(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[] скорее вызоветдеструктор по умолчанию для каждого из объектов, но не для указателей.

Вроде так.
PM MAIL   Вверх
azesmcar
Дата 12.6.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(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[] скорее вызоветдеструктор по умолчанию для каждого из объектов, но не для указателей.

где все этого нахватались? Какой деструктор по умолчанию? вы знаете и другие деструкторы? Деструктор один единственный на весь класс.
PM   Вверх
andrew_121
Дата 12.6.2009, 12:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



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

А кто такой х ?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 12.6.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



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

неизвестная smile 
оверхед smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1044 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.