MyVector.erase (myObject) вызывает удаление на myObject? - PullRequest
4 голосов
/ 20 июля 2010

Аналогично этот вопрос , но с объектами вместо указателей.

Если у меня есть следующий код

Foo f;
vector<Foo> vect;
vect.push_back(f);
vect.erase(vect.begin());

Куда уходит мой объект?На этом вызывается delete?Что если кто-то еще держит указатель на него?Это утечка памяти?

Ответы [ 5 ]

8 голосов
/ 20 июля 2010

push_back сохраняет копию из f в векторе, а erase уничтожает ее. f само по себе это не влияет.

Все указатели, ссылки и итераторы на элемент в векторе становятся недействительными, когда вы erase его. Использование их для доступа к элементу после erase приводит к неопределенному поведению.

3 голосов
/ 20 июля 2010

В вашем случае vector содержит копию f, а не указатель. На erase он просто уничтожит эту копию.

2 голосов
/ 20 июля 2010

С cplusplus.com

стирание итератора (позиция итератора);

стирание итератора (сначала итератор, потом итератор);

Это эффективно уменьшает вектор размер по количеству элементов удалено, вызывает каждый элемент перед деструктором.

Поскольку векторы сохраняют формат массива, стирание на позиции, кроме конец вектора также перемещает все элементы после того, как сегмент стерт до их нового позиции, которые не могут быть методом так же эффективно, как стирание в других видах контейнеров последовательностей (deque, list).

Это делает недействительными все итераторы и ссылки на элементы после позиции или первый.

В этом случае у вас все еще есть ваш объект f, потому что вы объявили его перед тем, как скопировать (с помощью pushback) в вектор.

Когда вы удаляете вектор, деструктор вызывается на скопированном объекте, и итератор вектора прерывается.

0 голосов
/ 20 июля 2010

При отталкивании элемента создается копия.После удаления копия уничтожается, но f все еще действует.Если у вас есть указатель на скопированный элемент, он станет висячей ссылкой, что означает, что содержимое, на которое указывает указатель, недопустимо.Если вы используете итератор для скопированного элемента, он также станет недействительным

0 голосов
/ 20 июля 2010

Да, erase вызывает деструктор для объекта (ов) в векторе.

Когда объект вставляется в вектор, вызывается его конструктор копирования, и его копия помещается в вектор, поэтому, если у вас есть указатель, указывающий на f (а копия * 1004 отсутствует* создан для вектора), вам не нужно беспокоиться о последствиях удаления объектов из вектора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...