Как вызвать деструктор из базового класса, который не является виртуальным?

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

Как я могу преодолеть это без изменения кода базового класса?

2 ответа

Решение

Предполагая, что вы имеете в виду, у вас есть указатель типа Base* (который не имеет виртуального деструктора), указывающий на объект типа Derivedи вы хотите удалить это.

Простой способ справиться с этой ситуацией - использовать умный указатель, такой как std::shared_ptr который запоминает исходный (статически известный) тип объекта и применяет его для удаления.

В целом, не используйте явные delete: оставьте это умным указателям и контейнерным объектам.

Вы можете привести базовый класс к производному и вызвать delete.

Другие вопросы по тегам