Выбор ответа Junior RAII и умные указатели спрашивают часто обновлено

delete для new[]

Вопрос

Что произойдёт при int* p = new int[10]; delete p;?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: UB: память из new[] освобождается только через delete[]. Пары new/delete и new[]/delete[] должны совпадать, иначе UB.

Варианты ответа

  1. UB: память из new[] освобождается только через delete[]правильный ответ
  2. Освободится только первый элемент, остальные девять утекут
  3. Всё корректно: для int без деструктора разницы нет
  4. Ошибка компиляции: delete не принимает указатель из new[]

Разбор

Пары new/delete и new[]/delete[] должны совпадать, иначе UB. На практике для тривиальных типов может «работать», а для классов с деструкторами ломает кучу. Лучше вообще std::vector<int> или std::make_unique<int[]>(10).

  • «Освободится первый элемент» лишь одна из возможных картин UB, а не гарантия.
  • Компилятор не различает такие указатели по типу, ошибки компиляции нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.