Sobes.tech
Junior — Middle

Kas notiks ar objekta destruktoru, ja tā konstruktorā rodas izņēmums?

sobes.tech AI

Atbilde no AI

Ja C++ objekta konstruktorā rodas izņēmums, tad šī objekta destruktors netiek izsaukts, jo objekts tiek uzskatīts par nepilnīgi izveidotu.

Tomēr, destruktori jau pilnībā izveidotu objekta locekļu un pamatklases, kas veiksmīgi tika konstruētas pirms izņēmuma rašanās, tiks izsaukti, lai pareizi atbrīvotu resursus.

Piemērs:

class A {
public:
    A() { throw std::runtime_error("Konstruktora kļūda"); }
    ~A() { std::cout << "A destruktors" << std::endl; }
};

class B {
    A a;
public:
    B() { }
    ~B() { std::cout << "B destruktors" << std::endl; }
};

int main() {
    try {
        B b; // veidojot a B() tiks izsaukta izņēmuma
    } catch (...) {
        std::cout << "Izņēmums noķerts" << std::endl;
    }
}

Šajā piemērā, B destruktors netiks izsaukts, jo objekts B nav pilnībā izveidots, bet A destruktors tiks izsaukts, ja A tika veiksmīgi izveidots pirms izņēmuma.