delete через указатель на базовый класс
struct Handler {
~Handler() { }
virtual void run() = 0;
};
struct FileHandler : Handler {
std::vector<char> buffer_; // несколько мегабайт
void run() override { }
~FileHandler() { flush(); }
};
Handler* h = new FileHandler();
h->run();
delete h;
Что не так с этим кодом?
- `delete` по указателю на базу с невиртуальным деструктором — неопределённое поведение: `~FileHandler()` не вызовется
- Абстрактный класс нельзя создавать через `new`, код не скомпилируется
- Ошибок нет: класс полиморфный, у него есть таблица виртуальных функций, поэтому и деструктор выбирается по фактическому типу объекта
- Ошибка только в стиле: нужно было использовать `std::unique_ptr<Handler>`, поведение при этом не изменилось бы
