Sobes.tech
Junior — Middle

Какво се случва с извикването на деструктора на обект, ако в конструктора му възникне изключение?

sobes.tech AI

Отговор от 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 е бил успешно конструиран преди изключението.