std::terminate
| Definiert in 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 Standardhandler 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, wenn die Spezifikation std::bad_exception nicht einschließt.
|
(bis C++17) |
|
7) Eine noexcept-Spezifikation wird verletzt (es ist implementierungsabhängig, 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 Ausnahme enthält.
9) Eine Ausnahme wird aus der Initialfunktion eines std::thread geworfen.
10) Ein joinable std::thread wird zerstört oder 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 Ausnahme wirft).
|
(seit C++11) |
|
12) Eine Funktion, die von einem parallelen Algorithmus aufgerufen wird, endet mit einer nicht abgefangenen Ausnahme und die Ausführungsrichtlinie gibt eine Beendigung an.
|
(seit C++17) |
std::terminate() kann auch direkt vom Programm aufgerufen werden.
Wenn std::terminate aufgrund einer geworfenen Ausnahme aufgerufen wird, wird ein impliziter Try/Catch-Handler als aktiv betrachtet. Daher gibt der Aufruf von std::current_exception die geworfene Ausnahme zurück.
In jedem Fall ruft std::terminate den aktuell installierten std::terminate_handler auf. Der Standard-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ührte, dass |
(bis C++11) |
|
Wenn ein Destruktor den terminate-Handler während des Stack-Unwindings zurücksetzt, ist es undefiniert, welcher Handler aufgerufen wird, wenn das Unwinding später dazu führte, dass |
(seit C++11) |
[bearbeiten] Anmerkungen
Wenn der Handler-Mechanismus nicht gewünscht ist, z.B. weil er atomare Operationen erfordert, die die Binärgröße aufblähen können, wird ein direkter Aufruf von std::abort bevorzugt, wenn das Programm abnormal beendet wird.
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.
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2111 | C++11 | Effekt des Aufrufs von std::set_terminate während des Stacks Unwinding unterscheidet sich von C++98 und bricht einige ABIs |
wurde nicht spezifiziert |
[bearbeiten] Siehe auch
| der Typ der Funktion, die von std::terminate aufgerufen wird (Typedef) | |
| verursacht abnormalen Programmabbruch (ohne Bereinigung) (funktion) | |
| (C++26) |
pausiert das laufende Programm, wenn es aufgerufen wird (Funktion) |