Вступить в клуб →
сложнаявопросЯзык C/C++ и работа с памятью

Удаление через указатель на базовый класс без виртуального деструктора

struct Sensor {
    ~Sensor() { /* закрывает дескриптор шины */ }
    virtual int read() = 0;
};

struct SpiSensor : Sensor {
    std::vector<uint8_t> frame_buf;
    ~SpiSensor() { /* освобождает ресурсы SPI */ }
    int read() override;
};

std::unique_ptr<Sensor> s = std::make_unique<SpiSensor>();
// ... s выходит из области видимости

Сервис за сутки съедает лишние сотни мегабайт. Какое утверждение о коде верно?

  • unique_ptr запоминает фактический тип SpiSensor в момент создания через make_unique и потому удаляет объект корректно
  • Раз в классе есть виртуальная функция read, таблица виртуальных методов уже создана и вызов деструктора тоже становится виртуальным
  • Это неопределённое поведение: без виртуального деструктора у базы ~SpiSensor не вызовется и frame_buf утечёт
  • make_unique не соберётся: компилятор потребует объявить виртуальный деструктор в Sensor до создания производного объекта

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

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

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

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