Junior — Middle
Mis juhtub objekti destruktoriga, kui selle konstruktoris tekib erand?
sobes.tech AI
Vastus AI-lt
Kui C++-s tekib objekti konstruktoris erand, siis selle objekti destruktor ei kutsuta, sest objekt peetakse mitte täielikult loodud.
Kuid, destruktorid juba täielikult loodud objekti liikmetest ja põhiklassidest, mis olid edukalt konstrueeritud enne erandi tekkimist, kutsutakse välja ressursside korrektseks vabastamiseks.
Näide:
class A {
public:
A() { throw std::runtime_error("Viga konstruktoris"); }
~A() { std::cout << "A destruktor" << std::endl; }
};
class B {
A a;
public:
B() { }
~B() { std::cout << "B destruktor" << std::endl; }
};
int main() {
try {
B b; // B() sees a loomisel visatakse erand
} catch (...) {
std::cout << "Erand haaratud" << std::endl;
}
}
Selles näites ei kutsuta B destruktorit, kuna B objekt ei olnud täielikult loodud, kuid A destruktor kutsutakse välja, kui A oli edukalt loodud enne erandi tekkimist.