std:: terminate
|
Défini dans l'en-tête
<exception>
|
||
|
void
terminate
(
)
;
|
(jusqu'à C++11) | |
|
[
[
noreturn
]
]
void
terminate
(
)
noexcept
;
|
(depuis C++11) | |
std::terminate()
est appelée par l'environnement d'exécution C++ lorsque le programme ne peut pas continuer pour l'une des raisons suivantes :
|
5)
Une
spécification d'exception dynamique
est violée et le gestionnaire par défaut pour
std::unexpected
est exécuté.
6)
Un gestionnaire non par défaut pour
std::unexpected
lance une exception qui viole la spécification d'exception dynamique précédemment violée, si la spécification n'inclut pas
std::bad_exception
.
|
(jusqu'à C++17) |
|
7)
Une
spécification noexcept
est violée (il est défini par l'implémentation si un déroulement de pile est effectué dans ce cas).
8)
std::nested_exception::rethrow_nested
est appelée pour un objet qui ne détient pas d'exception capturée.
9)
Une exception est levée depuis la fonction initiale de
std::thread
.
10)
Un
std::thread
joignable est détruit ou se voit assigner une valeur.
11)
std::condition_variable::wait
,
std::condition_variable::wait_until
, ou
std::condition_variable::wait_for
ne parvient pas à atteindre sa postcondition (par exemple si le verrouillage du mutex lève une exception).
|
(depuis C++11) |
|
12)
Une fonction invoquée par un
algorithme parallèle
se termine via une exception non capturée et la
politique d'exécution
spécifie l'arrêt.
|
(depuis C++17) |
std::terminate()
peut également être appelé directement depuis le programme.
Lorsque
std::terminate
est appelé en raison d'une exception levée, un gestionnaire try/catch implicite est considéré comme actif. Ainsi, l'appel à
std::current_exception
retournera l'exception levée.
Dans tous les cas,
std::terminate
appelle le
std::terminate_handler
actuellement installé. Le
std::terminate_handler
par défaut appelle
std::abort
.
|
Si un destructeur réinitialise le gestionnaire de terminaison pendant le déroulement de la pile et que le déroulement conduit ultérieurement à l'appel de
|
(jusqu'en C++11) |
|
Si un destructeur réinitialise le gestionnaire de terminaison pendant le déroulement de la pile, il n'est pas spécifié quel gestionnaire est appelé si le déroulement conduit ultérieurement à l'appel de
|
(depuis C++11) |
Notes
Si le mécanisme de gestionnaire n'est pas souhaité, par exemple car il nécessite des opérations atomiques qui pourraient gonfler la taille du binaire, un appel direct à std::abort est préférable lors de l'arrêt anormal du programme.
Certains intrinsèques de compilateur, par exemple
__builtin_trap
(gcc, clang, et icc) ou
__debugbreak
(msvc), peuvent être utilisés pour terminer le programme aussi rapidement que possible.
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| LWG 2111 | C++11 |
l'effet de l'appel à
std::set_terminate
pendant le déroulement
de la pile diffère de C++98 et brise certains ABI |
rendu non spécifié |
Voir aussi
|
le type de la fonction appelée par
std::terminate
(typedef) |
|
|
provoque la terminaison anormale du programme (sans nettoyage)
(fonction) |
|
|
(C++26)
|
met en pause le programme en cours d'exécution lorsqu'il est appelé
(fonction) |