Доброго времени суток.
Прошу пардону за дурацкий вопрос. Никак не уловлю из MSDN:
Если создаю контейнер STL (std::vector<>, std::list<>...), хранящий указатели на объекты моего класса, а потом удаляю контейнер (либо он сам удаляется, если был объявлен как обычная переменная), будет ли он удалять (вызывать деструкторы) хранящиеся в нем объекты? Следственный эксперимент показывает, что автоматически деструкторы не вызываются. Так и есть, или тут зарыт подводный камень?
Здравствуйте, ND321, Вы писали:
ND>Если создаю контейнер STL (std::vector<>, std::list<>...), хранящий указатели на объекты моего класса, а потом удаляю контейнер (либо он сам удаляется, если был объявлен как обычная переменная), будет ли он удалять (вызывать деструкторы) хранящиеся в нем объекты?
Здравствуйте, ND321, Вы писали:
ND>Прошу пардону за дурацкий вопрос. Никак не уловлю из MSDN: ND>Если создаю контейнер STL (std::vector<>, std::list<>...), хранящий указатели на объекты моего класса, а потом удаляю контейнер, будет ли он удалять (вызывать деструкторы) хранящиеся в нем объекты?
Он будет вызывать деструкторы для хранящихся в нём объектов. В данном случае в нём хранится объект типа "указатель на что то там в памяти".
Распознавать что в него наклали указателей и вызывать декструктор для того, на что указывают эти указатели контейнер не обязан.
Хочешь автоматики: возьми готовый или сам сделай класс-обёртку над указателем, который в своём деструкторе делает delete своему указателю. И храни в контейнере экземпляры этих классов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, ND321, Вы писали:
ND>Доброго времени суток. ND>Прошу пардону за дурацкий вопрос. Никак не уловлю из MSDN: ND>Если создаю контейнер STL (std::vector<>, std::list<>...), хранящий указатели на объекты моего класса, а потом удаляю контейнер (либо он сам удаляется, если был объявлен как обычная переменная), будет ли он удалять (вызывать деструкторы) хранящиеся в нем объекты? Следственный эксперимент показывает, что автоматически деструкторы не вызываются. Так и есть, или тут зарыт подводный камень?
Он будет уничтожать объекты указателей, но не то, на что они указывают.
Так что либо храни умные указатели, которые в момент уничтожения прибьют объект, на который указывают (например, boost::shared_ptr), либо используй специально заточенный для этого контейнер из коллекции Boost.PtrContainer: он обеспечит и корректное время жизни, и удобный интерфейс: http://www.boost.org/libs/ptr_container