Корректное освобождение памяти с STL
От: ND321  
Дата: 03.01.11 18:15
Оценка:
Доброго времени суток.
Прошу пардону за дурацкий вопрос. Никак не уловлю из MSDN:
Если создаю контейнер STL (std::vector<>, std::list<>...), хранящий указатели на объекты моего класса, а потом удаляю контейнер (либо он сам удаляется, если был объявлен как обычная переменная), будет ли он удалять (вызывать деструкторы) хранящиеся в нем объекты? Следственный эксперимент показывает, что автоматически деструкторы не вызываются. Так и есть, или тут зарыт подводный камень?
Re: Корректное освобождение памяти с STL
От: Shellac  
Дата: 03.01.11 18:19
Оценка:
Здравствуйте, ND321, Вы писали:

ND>Если создаю контейнер STL (std::vector<>, std::list<>...), хранящий указатели на объекты моего класса, а потом удаляю контейнер (либо он сам удаляется, если был объявлен как обычная переменная), будет ли он удалять (вызывать деструкторы) хранящиеся в нем объекты?


не будет
Re: Корректное освобождение памяти с STL
От: CreatorCray  
Дата: 03.01.11 23:14
Оценка:
Здравствуйте, ND321, Вы писали:

ND>Прошу пардону за дурацкий вопрос. Никак не уловлю из MSDN:

ND>Если создаю контейнер STL (std::vector<>, std::list<>...), хранящий указатели на объекты моего класса, а потом удаляю контейнер, будет ли он удалять (вызывать деструкторы) хранящиеся в нем объекты?
Он будет вызывать деструкторы для хранящихся в нём объектов. В данном случае в нём хранится объект типа "указатель на что то там в памяти".
Распознавать что в него наклали указателей и вызывать декструктор для того, на что указывают эти указатели контейнер не обязан.
Хочешь автоматики: возьми готовый или сам сделай класс-обёртку над указателем, который в своём деструкторе делает delete своему указателю. И храни в контейнере экземпляры этих классов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re: Корректное освобождение памяти с STL
От: jazzer Россия Skype: enerjazzer
Дата: 04.01.11 00:08
Оценка:
Здравствуйте, ND321, Вы писали:

ND>Доброго времени суток.

ND>Прошу пардону за дурацкий вопрос. Никак не уловлю из MSDN:
ND>Если создаю контейнер STL (std::vector<>, std::list<>...), хранящий указатели на объекты моего класса, а потом удаляю контейнер (либо он сам удаляется, если был объявлен как обычная переменная), будет ли он удалять (вызывать деструкторы) хранящиеся в нем объекты? Следственный эксперимент показывает, что автоматически деструкторы не вызываются. Так и есть, или тут зарыт подводный камень?

Он будет уничтожать объекты указателей, но не то, на что они указывают.
Так что либо храни умные указатели, которые в момент уничтожения прибьют объект, на который указывают (например, boost::shared_ptr), либо используй специально заточенный для этого контейнер из коллекции Boost.PtrContainer: он обеспечит и корректное время жизни, и удобный интерфейс:
http://www.boost.org/libs/ptr_container
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.