Удаление элемента из контейнера STL удаляет его из этого контейнера? - PullRequest
4 голосов
/ 23 января 2012

У меня есть класс Foobar с методом sayHello(), который выдает «Ну, привет!». Если я напишу следующий код

vector<unique_ptr<Foobar>> fooList;
fooList.emplace_back(new Foobar());

unique_ptr<Foobar> myFoo = move(fooList[0]);
unique_ptr<Foobar> myFoo2 = move(fooList[0]);
myFoo->sayHello();
myFoo2->sayHello();

cout << "vector size: " << fooList.size() << endl;

Вывод:

Well hello there!
Well hello there!
vector size: 1

Я запутался, почему это работает. Разве fooList[0] не должен становиться нулевым, когда я делаю первый ход? Почему myFoo2 работает?

Вот как выглядит Foobar:

class Foobar
{
public:
    Foobar(void) {};
    virtual ~Foobar(void) {};

    void sayHello() const {
        cout << "Well hello there!" << endl; 
    };
};

Ответы [ 2 ]

12 голосов
/ 23 января 2012

Разве fooList [0] не должен становиться нулевым, когда я делаю первый ход?

Да.

Почему работает myFoo2?

Это не так; это вызывает неопределенное поведение. Ваш компилятор генерирует код, который не падает, если вы используете нулевой указатель для вызова не виртуальной функции, которая не разыменовывает this.

Если вы измените функцию следующим образом, будет яснее, что происходит:

void sayHello() const {
    cout << "Well hello there! My address is " << this << endl; 
}

Well hello there! My address is 0x1790010
Well hello there! My address is 0
vector size: 1
1 голос
/ 23 января 2012

Ответ: нет, операции перемещения не удаляют элементы из контейнеров.

Другой комментарий: использование функции emplace_back может быть неадекватным.

try:

vector<unique_ptr<Foobar>> fooList;
fooList.emplace_back( new Foobar );
...