Назад к вопросамПочему удаление через этот
MiddleДебаггингИногда
Почему удаление через этот Base* может привести к утечке?
Derived владеет ресурсами, но запуск печатает только ~Base.
struct Base { ~Base() { std::cout << "~Base "; } }; // не virtual
struct Derived : Base { ~Derived() { std::cout << "~Derived "; } };
int main() {
Base* p = new Derived();
delete p;
}Найдите и исправьте ошибку.
Удаление Derived через Base*, у которого деструктор не virtual, — неопределённое поведение: на практике ~Derived не вызывается, и ресурсы, которыми он владеет, утекают. Решение: дать полиморфному базовому классу virtual-деструктор (или владеть им через unique_ptr).
- Считать, что деструктор диспетчеризуется виртуально без объявления его virtual
- Полагать, что деструктора базы достаточно, раз статический тип указателя — Base
- Путать это со срезкой объекта — здесь объект цел, неверна только его очистка
- Когда базовому классу НЕ нужен виртуальный деструктор?
- Как владение объектом через
std::unique_ptr<Base>устраняет эту ошибку?