Namespaces
Variants

std:: terminate

From cppreference.net
Definido en el encabezado <exception>
void terminate ( ) ;
(hasta C++11)
[ [ noreturn ] ] void terminate ( ) noexcept ;
(desde C++11)

std::terminate() es llamado por el runtime de C++ cuando el programa no puede continuar por cualquiera de las siguientes razones:

1) Se lanza una excepción y no es capturada (está definido por la implementación si se realiza algún desenrollado de pila en este caso).
2) Una función invocada directamente por el mecanismo de manejo de excepciones durante el manejo de una excepción que aún no ha sido capturada, sale mediante una excepción (por ejemplo, un destructor de algún objeto local, o un constructor de copia que construye un parámetro de cláusula catch).
3) El constructor o el destructor de un objeto estático o thread-local (since C++11) lanza una excepción.
4) Una función registrada con std::atexit o std::at_quick_exit (desde C++11) lanza una excepción.
5) Se viola una especificación de excepción dinámica y se ejecuta el manejador predeterminado para std::unexpected .
6) Un manejador no predeterminado para std::unexpected lanza una excepción que viola la especificación de excepción dinámica previamente violada, si la especificación no incluye std::bad_exception .
(until C++17)
7) Se viola una noexcept specification (está definido por la implementación si se realiza algún desenrollo de pila en este caso).
8) std::nested_exception::rethrow_nested se llama para un objeto que no contiene una excepción capturada.
9) Se lanza una excepción desde la función inicial de std::thread .
10) Un std::thread unible es destruido o asignado.
11) std::condition_variable::wait , std::condition_variable::wait_until , o std::condition_variable::wait_for no logra alcanzar su postcondición (por ejemplo, si al volver a bloquear el mutex se lanza una excepción).
(since C++11)
12) Una función invocada por un algoritmo paralelo termina mediante una excepción no capturada y la política de ejecución especifica terminación.
(since C++17)

std::terminate() también puede ser llamado directamente desde el programa.

Cuando std::terminate es llamado debido a una excepción lanzada, se considera que un manejador implícito try/catch está activo. Por lo tanto, llamar a std::current_exception devolverá la excepción lanzada.

En cualquier caso, std::terminate llama al std::terminate_handler actualmente instalado. El std::terminate_handler predeterminado llama a std::abort .

Si un destructor restablece el manejador de terminación durante el desenrollado de pila y el desenrollado posteriormente condujo a que se llamara a terminate , el manejador que estaba instalado al final de la expresión throw es el que será llamado. (nota: era ambiguo si el relanzamiento aplicaba los nuevos manejadores)

(until C++11)

Si un destructor restablece el manejador de terminación durante el desenrollado de pila, no está especificado qué manejador se llama si el desenrollado posteriormente condujo a que se llamara a terminate .

(since C++11)

Notas

Si no se desea el mecanismo del manejador, por ejemplo, porque requiere operaciones atómicas que pueden inflar el tamaño del binario, se prefiere una llamada directa a std::abort al terminar el programa de forma anormal.

Algunos intrínsecos del compilador, como __builtin_trap (gcc, clang, e icc) o __debugbreak (msvc), pueden utilizarse para terminar el programa lo más rápido posible.

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2111 C++11 efecto de llamar std::set_terminate durante el desenrollado de pila
difiere de C++98 y rompe algunas ABIs
hecho no especificado

Véase también

el tipo de la función llamada por std::terminate
(typedef)
causa la terminación anormal del programa (sin limpieza)
(función)
(C++26)
pausa el programa en ejecución cuando se llama
(función)