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.