Destructor
Автор ~WiZaRd задал вопрос в разделе Другие языки и технологии
Как работает виртуальный деструктор? что это? С++ и получил лучший ответ
Ответ от Ётепан Михалин[гуру]
деструктор осфобождает память, занимаемую тем или иным объектом и вызывается по окончанию функции, в которой создавался объект. Виртуальный деструктор возвращает память куче.
Источник: ну я типа программист:))
Ответ от Technoraptor[гуру]
Виртуальный деструктор отличается от обычного тем, что обычный освобождает память от объектов только заданного класса, а виртуальный - не только от объектов заданного, но и всех производных. И это очень удобно, поэтому виртуальные деструкторы использовать
Виртуальный деструктор отличается от обычного тем, что обычный освобождает память от объектов только заданного класса, а виртуальный - не только от объектов заданного, но и всех производных. И это очень удобно, поэтому виртуальные деструкторы использовать
Ответ от Technoraptor[гуру]
Виртуальный деструктор отличается от обычного тем, что обычный освобождает память от объектов только заданного класса, а виртуальный - не только от объектов заданного, но и всех производных. И это очень удобно, поэтому виртуальные деструкторы использовать предпочтительнее.
Пусть есть тип Father и порождённый от него тип Son:
class Father
{
public:
Father() {}
~Father() {}
};
class Son : public Father
{
public:
int* buffer;
Son() : Father() { buffer = new int[1024]; }
~Son() { delete[] buffer; }
};
Нижеприведённый код является некорректным и приводит к утечке памяти.
Father* object = new Son(); // вызывается Son()
delete object; // вызывается ~Father()!
Однако, если сделать деструктор Son виртуальным:
class Father
{
public:
Father() {}
virtual ~Father() {}
};
class Son : public Father
{
private:
int* buffer;
public:
Son() : Father() { buffer = new int[1024]; }
virtual ~Son() { delete[] buffer; }
};
вызов delete object; вызовет правильный деструктор класса Son.
Виртуальный деструктор отличается от обычного тем, что обычный освобождает память от объектов только заданного класса, а виртуальный - не только от объектов заданного, но и всех производных. И это очень удобно, поэтому виртуальные деструкторы использовать предпочтительнее.
Пусть есть тип Father и порождённый от него тип Son:
class Father
{
public:
Father() {}
~Father() {}
};
class Son : public Father
{
public:
int* buffer;
Son() : Father() { buffer = new int[1024]; }
~Son() { delete[] buffer; }
};
Нижеприведённый код является некорректным и приводит к утечке памяти.
Father* object = new Son(); // вызывается Son()
delete object; // вызывается ~Father()!
Однако, если сделать деструктор Son виртуальным:
class Father
{
public:
Father() {}
virtual ~Father() {}
};
class Son : public Father
{
private:
int* buffer;
public:
Son() : Father() { buffer = new int[1024]; }
virtual ~Son() { delete[] buffer; }
};
вызов delete object; вызовет правильный деструктор класса Son.
Ответ от 22 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: Как работает виртуальный деструктор? что это? С++