Sobes.tech
Junior — Middle

Mis juhtub objekti destruktoriga, kui selle konstruktoris tekib erand?

sobes.tech AI

Vastus AI-lt

Kui C++-s tekib objekti konstruktoris erand, siis selle objekti destruktor ei kutsuta, sest objekt peetakse mitte täielikult loodud.

Kuid, destruktorid juba täielikult loodud objekti liikmetest ja põhiklassidest, mis olid edukalt konstrueeritud enne erandi tekkimist, kutsutakse välja ressursside korrektseks vabastamiseks.

Näide:

class A {
public:
    A() { throw std::runtime_error("Viga konstruktoris"); }
    ~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; // B() sees a loomisel visatakse erand
    } catch (...) {
        std::cout << "Erand haaratud" << std::endl;
    }
}

Selles näites ei kutsuta B destruktorit, kuna B objekt ei olnud täielikult loodud, kuid A destruktor kutsutakse välja, kui A oli edukalt loodud enne erandi tekkimist.