Junior — Middle
Co się dzieje z wywołaniem destruktora obiektu, jeśli w jego konstruktorze wystąpi wyjątek?
sobes.tech AI
Odpowiedź od AI
Jeśli w konstruktorze obiektu w C++ wystąpi wyjątek, to destruktor tego obiektu nie zostanie wywołany, ponieważ obiekt jest uważany za nie w pełni utworzony.
Jednak destruktory już w pełni utworzonych członków obiektu i klas bazowych, które zostały pomyślnie skonstruowane przed wystąpieniem wyjątku, zostaną wywołane w celu poprawnego zwolnienia zasobów.
Przykład:
class A {
public:
A() { throw std::runtime_error("Błąd w konstruktorze"); }
~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; // podczas tworzenia a w B() zostanie wyrzucony wyjątek
} catch (...) {
std::cout << "Przechwycono wyjątek" << std::endl;
}
}
W tym przykładzie destruktor B nie zostanie wywołany, ponieważ obiekt B nie został w pełni utworzony, ale destruktor A zostanie wywołany, jeśli A został pomyślnie skonstruowany przed wystąpieniem wyjątku.