Удаление производного объекта с помощью указателя на его базовый класс
У меня есть два класса: base_class и производный класс и следующий код:
base_class *ptr = new derived_class;
delete ptr;
Будет ли этот код вызывать утечку памяти? Если да, то как мне с этим бороться?
Ответ 1
Это не приведет к утечке объекта, который вы удаляете, его блок памяти будет освобожден.
Если вы не объявили деструктор в base_class виртуальным, он протекает с любыми динамически выделенными объектами, содержащимися в derived_class, которые полагаются на деструктор derived_class, который вызывается для их освобождения. Это связано с тем, что если деструктор не является виртуальным, деструктор derived_class не вызывается в этом случае. Это также означает, что деструкторы "внедренных объектов" внутри derived_class не будут автоматически вызваны, отдельная, но дополнительная проблема, которая может привести к дальнейшим утечкам и неисполнение жизненного кода очистки.
Короче говоря, объявите деструктор в base_class виртуальным, и вы можете безопасно использовать технику, которую вы представили.