Удаление через указатель на базовый класс без виртуального деструктора
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 до создания производного объекта
