std:: terminate
|
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:
|
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
|
(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
|
(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) |