Sobes.tech
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.