Sobes.tech
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.