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 подскажет развёрнутый ответ в реальном времени.