Mediumconstructorexceptions
Можно ли бросать исключения из конструктора?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Да, можно и часто нужно — если конструктор не может завершить корректно. При throw деструктор этого объекта не вызывается, но деструкторы уже созданных членов и баз — вызываются.
// ПЛОХО: при throw в second — утечка rawPtr
class Bad {
int* a; int* b;
public:
Bad() : a(new int(1)), b(new int(2)) { throw X(); }
// при throw b выделился, но не удалится
};
// ХОРОШО: RAII-члены сами очистятся при throw
class Good {
std::unique_ptr<int> a, b;
public:
Good() : a(std::make_unique<int>(1)), b(std::make_unique<int>(2)) {
throw X(); // ~unique_ptr для a вызовется автоматически
}
};Правило нуля: члены-RAII делают конструктор исключением-безопасным без ручной очистки.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.