Выбор ответа Middle Исключения обновлено

Если бросил конструктор

Вопрос

Конструктор выделил data_ = new char[100]; сырым указателем, затем член std::string name_ создан, а дальше тело конструктора бросило. Что с ресурсами?

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

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

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

Коротко

Правильный ответ: Деструктор класса не вызовется: data утечёт, name уничтожится. Объект, чей конструктор не завершился, не считается созданным, его деструктор не запускается.

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

  1. Вызовется деструктор класса и освободит и data_, и name_
  2. Утекут и data_, и name_: деструкторы членов тоже не вызовутся
  3. Деструктор класса не вызовется: data_ утечёт, name_ уничтожитсяправильный ответ
  4. Программа вызовет std::terminate: бросать из конструктора нельзя

Разбор

Объект, чей конструктор не завершился, не считается созданным, его деструктор не запускается. Но полностью созданные члены и базы уничтожаются автоматически. Поэтому ресурс в сыром указателе теряется, а в std::unique_ptr<char[]> или std::vector<char> был бы освобождён.

  • Деструктор недостроенного объекта не вызывается никогда.
  • Строка уничтожается: она была полностью создана.
  • terminate здесь нет, исключение просто летит дальше.

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

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

Термины по теме