Junior — Middle
Mi történik az objektum destruktorának hívásával, ha kivétel keletkezik a konstruktorában?
sobes.tech MI
Válasz az MI-től
Ha kivétel történik egy C++-ban lévő objektum konstruktorában, akkor az objektum destruktora nem hívódik meg, mert az objektum nem teljesen létrehozottnak számít.
Azonban, azoknak a tagoknak és alap osztályok destruktorai, amelyek már teljesen létre lettek hozva és sikeresen konstrukciósak voltak a kivétel előtt, meghívásra kerülnek a források helyes felszabadítása érdekében.
Példa:
class A {
public:
A() { throw std::runtime_error("Hiba a konstruktorban"); }
~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; // a létrehozásakor B() kivétel keletkezik
} catch (...) {
std::cout << "Kivétel elfogva" << std::endl;
}
}
Ebben a példában, a B destruktora nem hívódik meg, mert a B objektum nem lett teljesen létrehozva, de az A destruktora meghívásra kerül, ha A sikeresen létre lett hozva a kivétel előtt.