Проверка работоспособности - удалится ли stl :: Container из новых объектов каждый после смерти самого контейнера? - PullRequest
0 голосов
/ 13 мая 2010

Название в значительной степени покрывает это. Если я добавил, скажем, 3 объекта в список, и список выходит из области видимости и умирает, вызовет ли он удаление для каждой записи перед выходом из области видимости? Уверен, да, но устаю и нуждаюсь в проверке работоспособности.

Ответы [ 5 ]

4 голосов
/ 13 мая 2010

Нет, ни один контейнер STL никогда не удалит ваши указатели. Это связано с тем, что контейнер STL никогда не становится владельцем ваших указателей, и поэтому контейнеры STL никогда не берут на себя ответственность за двойное удаление.

4 голосов
/ 13 мая 2010

Если у вас есть 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 ниже ...)

4 голосов
/ 13 мая 2010

Опрос говорит: я устал, и нет, они не будут удалять темы, если они не находятся в каком-то контейнере, безопасном интеллектуальном указателе в самом списке. Время сна ...

3 голосов
/ 13 мая 2010

Нет, объекты не будут удалены.

У Boost есть решение, Библиотека контейнеров указателей ускорения . Он не только удаляет указатели для вас, но и улучшает синтаксис общих операций, чтобы сделать их более удобными.

0 голосов
/ 13 мая 2010

Нет. «Удалить» не будет вызываться для каждого элемента. Если вы хотите, чтобы это произошло, то в списке должны содержаться умные указатели вместо простых указателей. См. C ++ STL вектор указателей . Если вы действительно ненавидите утечку памяти в вашем приложении, вам нужно явно вызвать delete для каждого указателя, прежде чем список выйдет из области видимости.

...