Выбор ответа Junior RAII и умные указатели спрашивают часто обновлено
delete для new[]
Вопрос
Что произойдёт при int* p = new int[10]; delete p;?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: UB: память из new[] освобождается только через delete[]. Пары new/delete и new[]/delete[] должны совпадать, иначе UB.
Варианты ответа
- UB: память из
new[]освобождается только черезdelete[]правильный ответ - Освободится только первый элемент, остальные девять утекут
- Всё корректно: для
intбез деструктора разницы нет - Ошибка компиляции:
deleteне принимает указатель изnew[]
Разбор
Пары new/delete и new[]/delete[] должны совпадать, иначе UB. На практике для тривиальных типов может «работать», а для классов с деструкторами ломает кучу. Лучше вообще std::vector<int> или std::make_unique<int[]>(10).
- «Освободится первый элемент» лишь одна из возможных картин UB, а не гарантия.
- Компилятор не различает такие указатели по типу, ошибки компиляции нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «RAII и умные указатели»
- Модель shared_ptr: кто и когда уничтожится
- Дерево на unique_ptr: перенос и удаление поддеревьев
- Управляющий блок shared_ptr
- Пользовательский удалитель
- Чем make_shared лучше shared_ptr(new T)
- Что происходит, когда умирает последний shared_ptr
- Что выведет: порядок конструкторов и деструкторов
- Что выведет: use_count и weak_ptr