Выбор ответа Middle Исключения обновлено
Если бросил конструктор
Вопрос
Конструктор выделил data_ = new char[100]; сырым указателем, затем член std::string name_ создан, а дальше тело конструктора бросило. Что с ресурсами?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Деструктор класса не вызовется: data утечёт, name уничтожится. Объект, чей конструктор не завершился, не считается созданным, его деструктор не запускается.
Варианты ответа
- Вызовется деструктор класса и освободит и
data_, иname_ - Утекут и
data_, иname_: деструкторы членов тоже не вызовутся - Деструктор класса не вызовется:
data_утечёт,name_уничтожитсяправильный ответ - Программа вызовет
std::terminate: бросать из конструктора нельзя
Разбор
Объект, чей конструктор не завершился, не считается созданным, его деструктор не запускается. Но полностью созданные члены и базы уничтожаются автоматически. Поэтому ресурс в сыром указателе теряется, а в std::unique_ptr<char[]> или std::vector<char> был бы освобождён.
- Деструктор недостроенного объекта не вызывается никогда.
- Строка уничтожается: она была полностью создана.
- terminate здесь нет, исключение просто летит дальше.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.