C ++ - вызывается ли деструктор, когда вектор содержит объекты? - PullRequest
2 голосов
/ 13 июня 2011

Если я динамически размещаю объекты класса внутри вектора, вызывается ли деструктор для каждого объекта, если я использую clear ()?

Ответы [ 2 ]

5 голосов
/ 13 июня 2011

Что вы подразумеваете под «динамически распределять» точно?Если вы используете vector<foo>, то все в порядке.Если вы помещаете указатели через vector<foo*>, то деструкторы не будут вызываться, потому что указатели сами по себе не имеют деструкторов.

Обратите внимание, однако, что в случае vector<foo> вы можете найтиКонструкторы и деструкторы вызывали намного больше, чем вы ожидаете, например, когда вектор изменен, потому что вектор будет использовать их при перемещении объектов в памяти, если это необходимо.Вы можете использовать Boost shared_ptr, чтобы обойти это, хотя из-за небольшой подсчётов счетов ведется небольшая стоимость.

Мой совет: используйте vector<foo>, если объекты дешевы для копирования и уничтоженияи vector<shared_ptr<foo> >, если они дорогие или их трудно / невозможно скопировать.Никогда не используйте vector<foo*>, если вы не хотите, чтобы вектор управлял памятью, и только тогда будьте осторожны;ИМХО это редко хорошая идея.

1 голос
/ 13 июня 2011

Да, все они очищены правильно.

С эта ссылка :

Все элементы вектора отброшены: их деструкторы называютсяи затем они удаляются из векторного контейнера, оставляя контейнер с размером 0.

Раздел [sequence.reqmts] следующего стандарта также проясняет это:

a.clear() уничтожает все элементы в a, делает недействительными все ссылки, указатели и итераторы, ссылающиеся на элементы a, и может лишить законной силы итератор.

...