Namespaces
Variants

std:: terminate

From cppreference.net
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 :

1) Une exception est levée et non capturée (il est défini par l'implémentation si un déroulement de pile est effectué dans ce cas).
2) Une fonction directement invoquée par le mécanisme de gestion des exceptions lors de la gestion d'une exception qui n'a pas encore été interceptée se termine via une exception (par exemple, un destructeur d'un objet local, ou un constructeur de copie construisant un paramètre de clause catch).
3) Le constructeur ou le destructeur d'un objet static ou thread-local (depuis C++11) lève une exception.
4) Une fonction enregistrée avec std::atexit ou std::at_quick_exit (depuis C++11) lance une exception.
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 terminate , c'est le gestionnaire qui était installé à la fin de l'expression throw qui sera appelé. (note : il était ambigu si le re-lancement appliquait les nouveaux gestionnaires)

(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 terminate .

(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)