Junior — Middle
Kas nutiks, jei objekto konstruktoriaus metu įvyksta išimtis, kas atsitiks su objekto destruktoriumi?
sobes.tech AI
Atsakymas iš AI
Jei C++-o objekto konstruktoriuje įvyksta išimtis, šio objekto destruktorius nėra iškviečiamas, nes objektas laikomas nevisiškai sukurtu.
Tačiau, destruktoriai jau visiškai sukurtų objekto narių ir pagrindinių klasių, kurios buvo sėkmingai sukonstruotos iki išimties, bus iškviečiami teisingam išteklių atlaisvinimui.
Pavyzdys:
class A {
public:
A() { throw std::runtime_error("Konstruktoriaus klaida"); }
~A() { std::cout << "A destruktorius" << std::endl; }
};
class B {
A a;
public:
B() { }
~B() { std::cout << "B destruktorius" << std::endl; }
};
int main() {
try {
B b; // kuriant a B() išmetama išimtis
} catch (...) {
std::cout << "Išimtis sugauta" << std::endl;
}
}
Šiame pavyzdyje, B destruktorius nebus iškviestas, nes B objektas nebuvo visiškai sukurtas, tačiau A destruktorius bus iškviestas, jei A buvo sėkmingai sukurtas prieš išimtį.