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