Удаление производного объекта с помощью указателя на его базовый класс

У меня есть два класса: base_class и производный класс и следующий код:

base_class *ptr = new derived_class;
delete ptr;

Будет ли этот код вызывать утечку памяти? Если да, то как мне с этим бороться?

Ответ 1

Это не приведет к утечке объекта, который вы удаляете, его блок памяти будет освобожден.

Если вы не объявили деструктор в base_class виртуальным, он протекает с любыми динамически выделенными объектами, содержащимися в derived_class, которые полагаются на деструктор derived_class, который вызывается для их освобождения. Это связано с тем, что если деструктор не является виртуальным, деструктор derived_class не вызывается в этом случае. Это также означает, что деструкторы "внедренных объектов" внутри derived_class не будут автоматически вызваны, отдельная, но дополнительная проблема, которая может привести к дальнейшим утечкам и неисполнение жизненного кода очистки.

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

Для кодированного примера см.

В какой ситуации деструктор С++ не будет вызываться?