2013-10-05 4 views
1

я прочитал, что метод правопреемником очищает вектор целевых показателей перед назначением ничего it.Does, что значит, если у нас есть вектор, такие как:Разница между вектором вставкой и назначить

vector<foo*> somevector; 

тогда правопреемник метод будет на самом деле delete foo * перед копированием данных в целевые индексы.

+0

Я не думаю, что уничтожение хранимых объектов произойдет до копирования, что не будет исключением. – yngccc

ответ

2

No. std::vector никогда не позвонит удалять хранимых указателей. Он просто уничтожит объект. В случае объектов класса с нетривиальными деструкторами уничтожение состоит из вызова этого деструктора. В случае указателей или любого другого тривиально разрушаемого объекта уничтожение состоит в том, что он ничего не делает.

1

Нет, стандартные контейнеры, содержащие указатели на объекты, никогда не вызывают удаление указателей - вы несете ответственность за это, если/когда это необходимо. Вот почему сохранение указателей - плохая идея.

+0

Не обязательно «плохая» идея, как таковая ... но следует делать с особой осторожностью. Вообще говоря, будет намного лучше обернуть указатели с помощью шаблона интеллектуального указателя (например, 'unique_ptr',' shared_ptr') –

3

тогда метод назначения фактически удалит foo * перед копированием данных в целевые индексы.

Нет, он удалит только сам указатель , но не удалит объекты, на которые указывают указатели.

Вам нужно быть осторожным при использовании необработанных указателей в контейнере STL. Если вы динамически выделяете элементы в somevector, вы получаете утечку памяти.

Больше практики способ заключается в использовании смарт-указатели в STL контейнер, динамически распределяемой памяти будет де-выделяемой в случае ниже:

std::vector<std::unique_ptr<foo>> somevector; 
+0

++ для рекомендации 'std :: unique_ptr'. – DavidO

Смежные вопросы