Spec-Zone.ru › C++

std::terminate

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

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

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

std::terminate() также может вызываться непосредственно из программы.

Когда std::terminate вызывается из-за выброшенного исключения, считается, что активен неявный обработчик try/catch. Таким образом, вызов std::current_exception вернёт выброшенное исключение.

В любом случае std::terminate вызывает установленный в данный момент std::terminate_handler. Обработчик std::terminate_handler по умолчанию вызывает std::abort.

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

(до C++11)

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

(начиная с C++11)

Примечания

Если механизм обработчика не требуется, например, потому что он может увеличить размер двоичного файла из-за необходимости атомарных операций, при аварийном завершении программы предпочтителен прямой вызов std::abort.

Для максимально быстрого завершения программы можно использовать некоторые встроенные средства компилятора, например __builtin_trap (gcc, clang и icc) или __debugbreak (msvc).

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам C++.

DR Применяется к Поведение согласно опубликованной версии Исправленное поведение
LWG 2111 C++11 эффект вызова std::set_terminate во время раскрутки
стека отличается от C++98 и нарушает работу некоторых ABI
сделан неопределённым

См. также

terminate_handler
тип функции, вызываемой std::terminate
(определение типа)
abort
вызывает аварийное завершение программы (без очистки)
(функция)
breakpoint
(C++26)
приостанавливает выполнение программы при вызове
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/error/terminate

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API