Namespaces
Variants

std:: terminate

From cppreference.net
Definiert im Header <exception>
void terminate ( ) ;
(bis C++11)
[ [ noreturn ] ] void terminate ( ) noexcept ;
(seit C++11)

std::terminate() wird von der C++-Laufzeitumgebung aufgerufen, wenn das Programm aus einem der folgenden Gründe nicht fortgesetzt werden kann:

1) Eine Exception wird geworfen und nicht abgefangen (es ist implementierungsdefiniert, ob in diesem Fall ein Stack Unwinding durchgeführt wird).
2) Eine Funktion, die direkt durch den Exception-Handling-Mechanismus aufgerufen wird, während eine noch nicht abgefangene Exception behandelt wird, beendet via einer Exception (z.B. ein Destruktor eines lokalen Objekts, oder ein Copy-Konstruktor, der einen Catch-Clause-Parameter konstruiert).
3) Der Konstruktor oder Destruktor eines static oder thread-local (since C++11) Objekts wirft eine Exception.
4) Eine Funktion, die mit std::atexit oder std::at_quick_exit (seit C++11) registriert wurde, wirft eine Exception.
5) Eine dynamische Ausnahmespezifikation wird verletzt und der Standard-Handler für std::unexpected wird ausgeführt.
6) Ein nicht-standard Handler für std::unexpected wirft eine Ausnahme, die die zuvor verletzte dynamische Ausnahmespezifikation verletzt, falls die Spezifikation std::bad_exception nicht einschließt.
(bis C++17)
7) Eine noexcept-Spezifikation wird verletzt (es ist implementierungsdefiniert, ob in diesem Fall ein Stack-Unwinding durchgeführt wird).
8) std::nested_exception::rethrow_nested wird für ein Objekt aufgerufen, das keine erfasste Exception enthält.
9) Eine Exception wird von der Initialfunktion von std::thread geworfen.
10) Ein joinbarer std::thread wird zerstört oder ihm wird ein Wert zugewiesen.
11) std::condition_variable::wait , std::condition_variable::wait_until oder std::condition_variable::wait_for erreicht seine Postcondition nicht (z.B. wenn das erneute Sperren des Mutex eine Exception wirft).
(seit C++11)
12) Eine durch einen parallelen Algorithmus aufgerufene Funktion wird durch eine nicht abgefangene Exception beendet und die Ausführungsrichtlinie sieht Abbruch vor.
(since C++17)

std::terminate() kann auch direkt vom Programm aus aufgerufen werden.

Wenn std::terminate aufgrund einer geworfenen Exception aufgerufen wird, gilt ein impliziter try/catch-Handler als aktiv. Daher gibt der Aufruf von std::current_exception die geworfene Exception zurück.

In jedem Fall ruft std::terminate den aktuell installierten std::terminate_handler auf. Der standardmäßige std::terminate_handler ruft std::abort auf.

Wenn ein Destruktor den Terminate-Handler während des Stack-Unwindings zurücksetzt und das Unwinding später dazu führt, dass terminate aufgerufen wird, wird der Handler aufgerufen, der am Ende des Throw-Ausdrucks installiert wurde. (Anmerkung: Es war unklar, ob erneutes Werfen die neuen Handler anwendet)

(until C++11)

Wenn ein Destruktor den Terminate-Handler während des Stack-Unwindings zurücksetzt, ist nicht spezifiziert, welcher Handler aufgerufen wird, wenn das Unwinding später dazu führt, dass terminate aufgerufen wird.

(since C++11)

Hinweise

Wenn der Handler-Mechanismus nicht gewünscht ist, z.B. weil er atomare Operationen erfordert, die die Binärgröße aufblähen könnten, ist ein direkter Aufruf von std::abort beim abnormen Beenden des Programms vorzuziehen.

Einige Compiler-Intrinsics, z.B. __builtin_trap (gcc, clang, und icc) oder __debugbreak (msvc), können verwendet werden, um das Programm so schnell wie möglich zu beenden.

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2111 C++11 Effekt des Aufrufs von std::set_terminate während Stack-
Unwinding unterscheidet sich von C++98 und bricht einige ABIs
als unspezifiziert festgelegt

Siehe auch

der Typ der Funktion, die von std::terminate aufgerufen wird
(Typedef)
verursacht abnormale Programmbeendigung (ohne Bereinigung)
(Funktion)
(C++26)
pausiert das laufende Programm beim Aufruf
(Funktion)