wirft Ausnahme vom Konstruktor in C ++

8

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.

    
user236215 10.03.2012, 01:47
quelle

4 Antworten

12

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%     
Collin 10.03.2012, 01:53
quelle
2
  

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.

    
quelle
1

Sie behandeln nicht die "Ausnahme".

%Vor%

Erstellen und ausführen ..

%Vor%

Beide C s zerstört und eine vollkommen normale Beendigung.

    
Johnsyweb 10.03.2012 01:57
quelle
1
%Vor%     
Yisong Zhu 26.10.2013 04:50
quelle