Вызывает ли STL Vector деструктор невыделенного объекта? - PullRequest
16 голосов
/ 24 сентября 2011

Следующий код показывает непредвиденный вывод:

class test
{
    public:
    test()
    {
        std::cout << "Created" << (long)this << std::endl;
    }
    ~test()
    {
        std::cout << "Destroyed" << (long)this << std::endl;
    }
};

int main(int argc, char** argv)
{
    std::vector<test> v;
    test t;
    v.push_back(t);

    return EXIT_SUCCESS;
}

При выполнении он показывает:

Created-1077942161
Destroyed-1077942161
Destroyed674242816

Я думаю, что второго "уничтоженного" вывода не должно быть.Когда я не использую вектор, результатом будет одна Созданная и одна Разрушенная линия, как и ожидалось.Это нормальное поведение?

(Это скомпилировано с GCC в системе FreeBSD)

Ответы [ 3 ]

31 голосов
/ 24 сентября 2011

Все так, как и должно быть: есть локальная переменная t, которая создается и затем уничтожается в конце main(), и есть v[0], которая создается и уничтожается в конце main().

Вы не видите создание v[0], потому что это происходит с помощью конструктора копирования или перемещения, который не предоставлен вашим тестовым классом.(Таким образом, компилятор предоставляет один для вас, но без вывода.)


Для целей тестирования удобно написать для себя раз и навсегда тестовый класс, который содержит все возможные конструкторы, деструкторы, присваивание ипоменяйте местами операторы и напечатайте диагностическую строку в каждой, чтобы вы могли наблюдать за поведением объектов при использовании в контейнерах и алгоритмах.

29 голосов
/ 24 сентября 2011
#include <cstdlib>
#include <vector>
#include <iostream>

class test
{
    public:
    test()
    {
        std::cout << "Created " << (long)this << std::endl;
    }
    test( const test& )
    {
        std::cout << "Copied " << (long)this << std::endl;
    }
    ~test()
    {
        std::cout << "Destroyed " << (long)this << std::endl;
    }
};

int main(int argc, char** argv)
{
    std::vector<test> v;
    test t;
    v.push_back(t);

    return EXIT_SUCCESS;
}

Вывод:

Created -1076546929
Copied 147865608
Destroyed -1076546929
Destroyed 147865608

std::vector::push_back копирует объект t, вы можете увидеть конструктор копирования, вызываемый вышеупомянутымкод.

2 голосов
/ 24 сентября 2011

Вектор содержит копию t, поэтому после вызова push_back у вас есть две версии t ... одна в стеке, а другая в векторе.Поскольку векторная версия была создана copy-construtor, вы не видите подсказку «Created ...» для этого объекта ... но она все равно должна быть уничтожена, когда векторный контейнер выходит из области видимости, поэтому вы получаете дваСообщения "Уничтожено ...".

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