Sobes.tech
Back to questions
Junior — Middle
88

Что произойдет с вызовом деструктора объекта, если в его конструкторе возникло исключение?

Companies where asked
Открытые РешенияОткрытые Решения

Answer from AI

sobes.tech AI

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

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

Пример:

class A {
public:
    A() { throw std::runtime_error("Ошибка в конструкторе"); }
    ~A() { std::cout << "Деструктор A" << std::endl; }
};

class B {
    A a;
public:
    B() { }
    ~B() { std::cout << "Деструктор B" << std::endl; }
};

int main() {
    try {
        B b; // при создании a в B() выбросится исключение
    } catch (...) {
        std::cout << "Исключение поймано" << std::endl;
    }
}

В этом примере деструктор B не вызовется, так как объект B не был полностью создан, но деструктор A вызовется, если A был успешно сконструирован до исключения.