Sobes.tech
Junior — Middle

Was passiert mit dem Aufruf des Destruktors eines Objekts, wenn im Konstruktor eine Ausnahme auftritt?

sobes.tech KI

Antwort von AI

Wenn im Konstruktor eines Objekts in C++ eine Ausnahme auftritt, wird der Destruktor dieses Objekts nicht aufgerufen, weil das Objekt als nicht vollständig erstellt gilt.

Allerdings werden die Destruktoren der bereits vollständig erstellten Mitglieder des Objekts und der Basisklassen, die vor dem Auftreten der Ausnahme erfolgreich konstruiert wurden, aufgerufen, um Ressourcen ordnungsgemäß freizugeben.

Beispiel:

class A {
public:
    A() { throw std::runtime_error("Fehler im Konstruktor"); }
    ~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; // Beim Erstellen von a in B() wird eine Ausnahme ausgelöst
    } catch (...) {
        std::cout << "Ausnahme gefangen" << std::endl;
    }
}

In diesem Beispiel wird der Destruktor von B nicht aufgerufen, da das Objekt B nicht vollständig erstellt wurde, aber der Destruktor von A wird aufgerufen, wenn A vor der Ausnahme erfolgreich konstruiert wurde.