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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Самоудаление вложенного вектора 
:(
    Опции темы
semibug
Дата 11.9.2010, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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




Имеем 

Код

typedef struct TagListItem 
{
    std::vector < int > Info;
} ListItem;

std::vector< ListItem > List;


К примеру в List уже было добавлено несколько элементов, содержащих векторы Info разного размера.
Если вызвать List.clear, будет ли освобождена память, выделенная под векторы Info, или надо её самостоятельно освободить в цикле с помощью Info.clear ?
PM   Вверх
htzg
Дата 11.9.2010, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(semibug @  11.9.2010,  11:03 Найти цитируемый пост)
будет ли освобождена память, выделенная под векторы Info
 будет

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


hell is here
**


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

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



semibug, все освобождается нормально, до тех пор, пока там не указатели лежат
PM MAIL   Вверх
semibug
Дата 11.9.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



alexvs11, т.е. clear делает delete для каждого элемента вектора? (а в деструкторе вложенных векторов соответственно освобождается память, занятая под элементы целого типа).
PM   Вверх
bsa
Дата 12.9.2010, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(semibug @  11.9.2010,  12:44 Найти цитируемый пост)
alexvs11, т.е. clear делает delete для каждого элемента вектора?

В том то и дело, что delete он не делает. Т.е. если ты в векторе хранишь единственные указатели на выделенную память, то после clear ты произойдет "утечка". Если уж хранишь указатели, то перед vector::clear нужно вручную вызвать delete для каждого указателя. Но если в векторе хранится элемент (НЕ УКАЗАТЕЛЬ НА ЭЛЕМЕНТ), то clear корректно уничтожит этот объект. Короче, clear вызывает деструкторы всех хранящихся в векторе объектов. Деструктор обычного (т.е. не "умного") указателя ничего не делает (как и всех остальных стандартных типов: int, double...).
PM   Вверх
azesmcar
Дата 13.9.2010, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



semibug

Просто запомни правило - количество операторо new и операторов delete должно быть эквивалентно. А точнее если сделал new, то где-то должен быть и delete. В данном конкретном случае ты динамической памяти с помощью new не выделял, а это значит и освобождать ничего не надо. vector выделяет динамическую память для размещения твоих объектов, но за ней он следит сам, это его забота, ты должен следить за теми объектами, которые создал сам с помощью оператора new. Твой код мог выглядеть так
Код

std::vector<int*> v;
v.push_back(new int(1));
v.push_back(new int(2));
...

за эти объекты вектор не в ответе, он очистит память, выделенную для размещения указателей на эти объекты, а сами объекты тебе придется подчищать самому
Код

for (std::vector<int*>::iterator it ... )
   delete *it;

конечно же этого можно избежать, с помощью умных указателей
Код

std::vector< boost::shared_ptr<int> > v;
...

тогда boost::shared_ptr сам очистит память.

по причине отсутствия библиотеки boost может возникнуть соблазн использовать std::auto_ptr, но этого ни в коем случае нельзя делать (да и не получиться).

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

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

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

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

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


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

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


 




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


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

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