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

Класс с сырым указателем скопировали по значению

Модуль обработки кадров падает с double free or corruption примерно раз в сотню запусков:

class Frame {
public:
    explicit Frame(size_t n) : data_(new uint8_t[n]), size_(n) {}
    ~Frame() { delete[] data_; }
    uint8_t* data() { return data_; }
private:
    uint8_t* data_;
    size_t size_;
};

void enqueue(Frame f);          // приём по значению

Frame f(1920 * 1080);
enqueue(f);
process(f.data());

В чём причина и что вы предложите на ревью?

  • Причина в приёме параметра по значению: достаточно поменять сигнатуру на `enqueue(const Frame&)`, класс трогать не нужно
  • Наличие пользовательского деструктора запрещает компилятору генерировать копирующий конструктор, поэтому копия делается поверхностно и только в оптимизированной сборке
  • `delete[]` неприменим к памяти из `new uint8_t[n]` — из-за этого куча повреждается при каждом освобождении
  • Сгенерированный копирующий конструктор скопировал сам указатель — оба объекта освобождают один буфер

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

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

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

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