C++ деструктор вызывается дважды

Код класса:

class demo_
{
    protected:
        sf::CircleShape* demo_point;

    public:
        demo_()
        {
            std::cout << "init\n";
            demo_point = new sf::CircleShape();
        }

        ~demo_()
        {
            std::cout << "delete\n";
            delete demo_point;
        }
};

Код в main:

std::vector <demo_> obj;

    std::cout << "1\n";
    for (int i = 0; i < 100; i++) {
        std::cout << "3\n";
        demo_ tpoint = demo_();
        //tpoint.SetColor(GetRandomColor());
        //tpoint.SetRadius(5.f);
        //tpoint.SetStartPosition((float)(rand() % sizeWindowX), (float)(rand() %  sizeWindowY));
        obj.push_back(tpoint);
    }
    std::cout << "2\n";

Результат работы:

1
3
init
delete
3
init
delete
delete

Исключение : нарушение прав доступа при чтении по адресу

Почему деструктор вызвался дважды для второго demo_ в цикле?


Ответы (1 шт):

Автор решения: KoVadim

Краткий ответ - здесь нарушение правила трех/пяти

Так как у Вас нетривиальный конструктор и деструктор (а по простому - в классе есть голый указатель), то нужно дописать конструктор копирования и оператор присваивания с правильным пробросом/копированием указателя. И все будет работать.

Почему возникла проблема? когда вектор внутри расширяется, он выделяет новое место и копирует туда свои элементы. А конструктора копирования нет - поэтому он сгенерировал его сам, где просто копирует сам указатель. А когда деструктор освобождает, то у другого деструктора возникают проблемы.

Так как один конструктор Вы не учли, то Вам и не понятно, почему ещё раз вызывается деструктор.

→ Ссылка