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