Если у вас есть std::list<T> my_list;
и затем my_list
выходит из области видимости, каждый T
объект в списке будет удален.
Вопрос теперь в том, какие объекты вы храните в своем контейнере?
Если в вашем контейнере есть реальные объекты, например, std::list<MyClass>
, объекты будут удалены и для каждого из них будет вызван MyClass::~MyClass
.
Если вместо этого у вас есть только указатели на объекты, например, std::list<MyClass*>
, указатели будут удалены, но нацеленные объекты будут не удалены!
Если вам нужно хранить указатели на объекты и вы хотите, чтобы указанные объекты уничтожались при смерти контейнера, вам придется использовать некоторые из умных указателей (например, boost::smart_ptr
*), которые удаляют их объект как сами указатели удаляются. Или вам нужно вручную просмотреть список и уничтожить объекты, прежде чем уничтожить контейнер указателей, но это более подвержено ошибкам и может потребовать дополнительной работы, чтобы убедиться, что вы делаете это в случае исключения.
*std::auto_ptr
имеет необычный operator=()
, который несовместим с требованиями контейнеров. (Спасибо j-random-hacker - пожалуйста, дайте ему +1 ниже ...)