Класс с сырым указателем скопировали по значению
Модуль обработки кадров падает с 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]` — из-за этого куча повреждается при каждом освобождении
- Сгенерированный копирующий конструктор скопировал сам указатель — оба объекта освобождают один буфер
