std:: terminate
|
Определено в заголовочном файле
<exception>
|
||
|
void
terminate
(
)
;
|
(до C++11) | |
|
[
[
noreturn
]
]
void
terminate
(
)
noexcept
;
|
(начиная с C++11) | |
std::terminate()
вызывается средой выполнения C++ в случаях, когда программа не может продолжить работу по одной из следующих причин:
|
5)
Нарушена
динамическая спецификация исключений
и выполняется обработчик по умолчанию для
std::unexpected
.
6)
Нестандартный обработчик для
std::unexpected
выбрасывает исключение, которое нарушает ранее нарушенную динамическую спецификацию исключений, если спецификация не включает
std::bad_exception
.
|
(до C++17) |
|
7)
Нарушена
спецификация noexcept
(определяется реализацией, выполняется ли в этом случае какое-либо раскручивание стека).
8)
std::nested_exception::rethrow_nested
вызывается для объекта, который не содержит захваченное исключение.
9)
Исключение выбрасывается из начальной функции
std::thread
.
10)
Уничтожается или присваивается значение присоединяемому
std::thread
.
11)
std::condition_variable::wait
,
std::condition_variable::wait_until
или
std::condition_variable::wait_for
не достигает своего постусловия (например, если повторная блокировка мьютекса выбрасывает исключение).
|
(since C++11) |
|
12)
Функция, вызываемая
параллельным алгоритмом
, завершается через неперехваченное исключение, и
политика выполнения
предписывает завершение.
|
(since C++17) |
std::terminate()
также может быть вызван напрямую из программы.
Когда
std::terminate
вызывается из-за брошенного исключения, считается активным неявный обработчик try/catch. Следовательно, вызов
std::current_exception
вернет брошенное исключение.
В любом случае,
std::terminate
вызывает установленный в данный момент
std::terminate_handler
. Стандартный
std::terminate_handler
вызывает
std::abort
.
|
Если деструктор сбрасывает обработчик завершения во время раскрутки стека и раскрутка позже приводит к вызову
|
(until C++11) |
|
Если деструктор сбрасывает обработчик завершения во время раскрутки стека, не определено, какой обработчик будет вызван, если раскрутка позже приведет к вызову
|
(since C++11) |
Примечания
Если механизм обработчиков не требуется, например, потому что он требует атомарных операций, которые могут увеличить размер бинарного файла, прямой вызов std::abort предпочтителен при аварийном завершении программы.
Некоторые встроенные функции компилятора, например
__builtin_trap
(gcc, clang, и icc) или
__debugbreak
(msvc), могут быть использованы для максимально быстрого завершения программы.
Отчёты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2111 | C++11 |
effect of calling
std::set_terminate
during stack
unwinding differs from C++98 and breaks some ABIs |
made unspecified |
Смотрите также
|
тип функции, вызываемой
std::terminate
(typedef) |
|
|
вызывает аварийное завершение программы (без очистки)
(function) |
|
|
(C++26)
|
приостанавливает выполнение программы при вызове
(function) |