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>устраняет эту ошибку?