Ich habe hier schon einige Artikel gelesen und wo es in Ordnung ist, eine Ausnahme vom Konstruktor zu werfen. Ich habe jedoch bemerkt, dass Destruktor der Basisklasse oder deren Datenelemente nicht aufgerufen wird, wenn eine Ausnahme vom Konstruktor ausgelöst wird. Betrachten Sie das folgende Beispiel:
%Vor%In diesem Fall löst der Konstruktor von E eine Ausnahme aus, aber der Destruktor von C als Datenelement oder als Basisklasse wird nicht aufgerufen. Wenn der Destruktor von C einige Säuberungsoperationen wie das Schließen von Dateien / Sockets und das Löschen von Heapzuweisungen durchführt, kann dies zu Problemen führen.
Also meine Frage ist warum und wann ist es in Ordnung, Ausnahmen von Konstruktoren zu werfen.
Wenn Sie den Fehler abfangen, wird der Destruktor ausgeführt. Wenn in C ++ eine nicht abgefangene Ausnahme ausgelöst wird, ruft die Laufzeit std::terminate
auf. Standardmäßig ruft std::terminate
std::abort
auf, das Destruktoren auf dem Weg nach draußen nicht explizit aufruft .
Mit dieser Version:
%Vor%Ich bekomme ausgegeben:
%Vor%Ich habe festgestellt, dass es den Destruktor der Basisklasse oder seine Datenelemente nicht aufruft, wenn eine Ausnahme vom Konstruktor ausgelöst wird.
Ja, tut es.
Allerdings , da Sie catch
diese Ausnahme im gesamten Programm nicht haben, wird das Programm sofort beendet .
Wenn Sie die Ausnahme irgendwo in der Aufrufliste abfangen würden, würden die Destruktoren der Basisklasse und der Member wie erwartet aufgerufen.
Tags und Links c++ exception-handling constructor