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