Junior — Middle
Čo sa stane s volaním destruktora objektu, ak v jeho konštruktore vznikne výnimka?
sobes.tech AI
Odpoveď od AI
Ak v konštruktore objektu v C++ nastane výnimka, destruktor tohto objektu sa nevolá, pretože objekt sa považuje za nedokončený.
Avšak, destruktory už úplne vytvorených členov objektu a základných tried, ktoré boli úspešne konštruované pred výskytom výnimky, budú volané na správne uvoľnenie zdrojov.
Príklad:
class A {
public:
A() { throw std::runtime_error("Chyba v konštruktore"); }
~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; // pri vytváraní a v B() dôjde k výnimke
} catch (...) {
std::cout << "Výnimka zachytená" << std::endl;
}
}
V tomto príklade sa destruktor B nevolá, pretože objekt B nebol úplne vytvorený, ale destruktor A sa zavolá, ak bol A úspešne vytvorený pred výnimkou.