Junior — Middle
Co se stane s voláním destruktoru objektu, pokud v jeho konstruktoru dojde k výjimce?
sobes.tech AI
Odpověď od AI
Pokud dojde k výjimce v konstruktoru objektu v C++, destruktor tohoto objektu není volán, protože objekt je považován za nedokončený.
Nicméně, destruktory již plně vytvořených členů objektu a základních tříd, které byly úspěšně konstrukčně vytvořeny před vznikem výjimky, budou volány pro správné uvolnění zdrojů.
Příklad:
class A {
public:
A() { throw std::runtime_error("Chyba v konstruktoru"); }
~A() { std::cout << "Destruktor A" << std::endl; }
};
class B {
A a;
public:
B() { }
~B() { std::cout << "Destruktor B" << std::endl; }
};
int main() {
try {
B b; // při vytváření a v B() dojde k výjimce
} catch (...) {
std::cout << "Výjimka zachycena" << std::endl;
}
}
V tomto příkladu se destruktor B nevolá, protože objekt B nebyl úplně vytvořen, ale destruktor A se zavolá, pokud byl úspěšně konstrukčně vytvořen před výjimkou.