Namespaces
Variants

std:: terminate

From cppreference.net
Определено в заголовочном файле <exception>
void terminate ( ) ;
(до C++11)
[ [ noreturn ] ] void terminate ( ) noexcept ;
(начиная с C++11)

std::terminate() вызывается средой выполнения C++ в случаях, когда программа не может продолжить работу по одной из следующих причин:

1) Исключение выбрасывается и не перехватывается (в этом случае определяется реализацией, происходит ли раскрутка стека).
2) Функция, непосредственно вызываемая механизмом обработки исключений при обработке еще не перехваченного исключения, завершается через исключение (например, деструктор некоторого локального объекта или конструктор копирования, создающий параметр предложения catch).
3) Конструктор или деструктор статического или thread-local (since C++11) объекта выбрасывает исключение.
4) Функция, зарегистрированная с помощью std::atexit или std::at_quick_exit (начиная с C++11) выбрасывает исключение.
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 .

Если деструктор сбрасывает обработчик завершения во время раскрутки стека и раскрутка позже приводит к вызову terminate , будет вызван обработчик, который был установлен в конце выражения throw. (примечание: было неясно, применяются ли новые обработчики при повторном выбросе)

(until C++11)

Если деструктор сбрасывает обработчик завершения во время раскрутки стека, не определено, какой обработчик будет вызван, если раскрутка позже приведет к вызову terminate .

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