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 шт):
Краткий ответ - здесь нарушение правила трех/пяти
Так как у Вас нетривиальный конструктор и деструктор (а по простому - в классе есть голый указатель), то нужно дописать конструктор копирования и оператор присваивания с правильным пробросом/копированием указателя. И все будет работать.
Почему возникла проблема? когда вектор внутри расширяется, он выделяет новое место и копирует туда свои элементы. А конструктора копирования нет - поэтому он сгенерировал его сам, где просто копирует сам указатель. А когда деструктор освобождает, то у другого деструктора возникают проблемы.
Так как один конструктор Вы не учли, то Вам и не понятно, почему ещё раз вызывается деструктор.