Класс с сырым указателем: двойное освобождение при передаче по значению
struct Buffer {
char *data;
explicit Buffer(size_t n) : data(new char[n]) {}
~Buffer() { delete[] data; }
};
void use(Buffer b) { /* читает b.data */ }
int main() {
Buffer a(1024);
use(a); // (1)
return 0; // (2)
}
Программа падает при выходе из main, отладчик показывает срабатывание проверок аллокатора. Что происходит?
- Аргумент передан по значению, поэтому new char[n] выполняется второй раз и первый буфер теряется — это утечка
- delete[] неприменим к памяти под char*, освобождать такой блок нужно вызовом free из стандартной библиотеки C
- Копия в точке (1) получает то же значение data; её деструктор и деструктор a освобождают один блок дважды
- Причина в explicit: он мешает компилятору сгенерировать корректное копирование, без него код отработал бы верно
