ПрограммированиеC++ разработчик

Что такое виртуальный деструктор в C++ и для чего он нужен? Приведите пример некорректного поведения при отсутствии виртуального деструктора.

Проходите собеседования с ИИ помощником Hintsage

Ответ.

Виртуальный деструктор — это деструктор, объявленный с ключевым словом virtual в базовом классе. Это гарантирует вызов деструктора производного класса при удалении объекта через указатель на базовый класс.

class Base { public: virtual ~Base() { /* ... */ } }; class Derived : public Base { public: ~Derived() override { /* ... */ } }; Base* ptr = new Derived(); delete ptr; // Вызовутся оба деструктора

Без виртуального деструктора поведение может быть некорректным — деструктор производного класса не вызовется, что приведёт к утечке ресурсов!


Вопрос с подвохом.

Нужно ли объявлять деструктор виртуальным, если в вашем базовом классе нет ни одной виртуальной функции?

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

class Shape { public: virtual ~Shape() {} };

Примеры реальных ошибок из-за незнания тонкостей темы.


История 1

В крупном проекте графической библиотеки при удалении объектов-рисовалок через указатель на базовый класс утекали OpenGL-ресурсы (буферы, текстуры) — соответствующие освобождения находились в деструкторах производных классов, а они не вызывались.


История 2

В сетевой библиотеке для протокола TCP при удалении сессий, не был вызван деструктор наследников, управляемых через общий базовый интерфейс. Это привело к массовому зависанию сокетов и истощению лимитов дескрипторов.


История 3

В embedded-системе на C++ неправильно объявленный (неvirtual) деструктор базового класса вызвал утечку памяти для системных ресурсов контролёров ввода-вывода, устройства выходили из строя после нескольких циклов обновления драйверов.