Вступить в клуб →
средняявопросПамять и RAII

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>`, поведение при этом не изменилось бы

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела