Как вызвать деструктор из базового класса, который не является виртуальным?
Предположим, у меня есть класс, который наследуется от другого класса, и я создаю указатель от точки базового класса на объект производного класса. Теперь, если деструктор базового класса был определен как виртуальный, он не будет создавать никаких проблем. Однако в моем случае деструктор базового класса не был объявлен виртуальным, поэтому при удалении этого указателя это приведет к утечке памяти.
Как я могу преодолеть это без изменения кода базового класса?
2 ответа
Предполагая, что вы имеете в виду, у вас есть указатель типа Base*
(который не имеет виртуального деструктора), указывающий на объект типа Derived
и вы хотите удалить это.
Простой способ справиться с этой ситуацией - использовать умный указатель, такой как std::shared_ptr
который запоминает исходный (статически известный) тип объекта и применяет его для удаления.
В целом, не используйте явные delete
: оставьте это умным указателям и контейнерным объектам.
Вы можете привести базовый класс к производному и вызвать delete.