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

Класс с сырым указателем: двойное освобождение при передаче по значению

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: он мешает компилятору сгенерировать корректное копирование, без него код отработал бы верно

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

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

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

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