TGViewer
C/C++ | Вопросы собесов C/C++ | Вопросы собесов @easy_c_plus · 4.2K subscribers
Post #2285 461
🤔 Что можешь сказать про исключение в конструкторе?

Если конструктор выбрасывает исключение, объект считается не созданным. Это означает, что деструктор вызываться не будет, но уже созданные части объекта могут потребовать очистки.

🚩Что происходит при исключении в конструкторе?

Когда исключение возникает в конструкторе:
Объект не создаётся – вызов конструктора считается неудачным.
Деструктор НЕ вызывается – потому что объект не был полностью создан.
Уже созданные члены класса должны быть очищены вручную (если используются RAII-объекты, они сами очистят ресурсы).
Исключение должно быть обработано – либо перехвачено (try-catch), либо передано дальше.

🚩Пример исключения в конструкторе

#include <iostream>
#include <stdexcept>

class MyClass {
public:
MyClass() {
std::cout << "Конструктор\n";
throw std::runtime_error("Ошибка в конструкторе!");
}

~MyClass() {
std::cout << "Деструктор\n";
}
};

int main() {
try {
MyClass obj; // Попытка создать объект
} catch (const std::exception& e) {
std::cout << "Поймано исключение: " << e.what() << '\n';
}
}


Вывод программы
Конструктор
Поймано исключение: Ошибка в конструкторе!


🚩Как правильно работать с исключениями в конструкторе?

🟠Использовать RAII
Лучший способ избежать утечек – использовать RAII (объекты, которые сами освобождают ресурсы в деструкторе).
#include <iostream>
#include <memory>
#include <stdexcept>

class MyClass {
private:
std::unique_ptr<int> data; // Умный указатель RAII
public:
MyClass() : data(std::make_unique<int>(42)) {
throw std::runtime_error("Ошибка!");
}
};

int main() {
try {
MyClass obj;
} catch (const std::exception& e) {
std::cout << "Ошибка: " << e.what() << '\n';
}
}


🟠Использовать `try-catch` внутри конструктора
Если важно, чтобы объект всегда создавался, можно перехватывать исключение прямо в конструкторе.
class MyClass {
public:
MyClass() {
try {
throw std::runtime_error("Ошибка!");
} catch (...) {
std::cout << "Ошибка обработана, объект создан\n";
}
}
};


🟠Использовать `noexcept(false)` или `noexcept(true)`
По умолчанию конструкторы могут выбрасывать исключения, но если мы точно знаем, что этого не произойдёт, лучше явно указать noexcept:
class SafeClass {
public:
SafeClass() noexcept {
std::cout << "Конструктор без исключений\n";
}
};


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_c_plus
  1. Oct 12, 2026🤔 Какие есть уровни exception гарантий? 1. No-throw Guarantee: метод или операция не выбр…
  2. Oct 12, 2026🤔 Какая сложность поиска в set и unordered_set? Контейнеры set и unordered_set представля…
  3. Oct 11, 2026Post #2563
  4. Oct 11, 2026🤔 Как проверять равенство двух float? Равенство двух float проверяется с учётом допустимо…
  5. Oct 11, 2026🤔 Расскажи о истории умных указателей История умных указателей (smart pointers) в C++ свя…
  6. Oct 10, 2026🤔 Зачем нужен виртуальный деструктор? Виртуальный деструктор необходим, когда класс предп…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →