std::terminate
Объявлен в заголовочном файле <exception> | ||
|---|---|---|
void terminate(); | (до C++11) | |
[[noreturn]] void terminate() noexcept; | (начиная с C++11) |
std::terminate() вызывается средой выполнения C++ в случаях, когда программа не может продолжить выполнение по одной из следующих причин:
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.
| Если деструктор сбросил обработчик завершения во время раскрутки стека, а раскрутка впоследствии привела к вызову | (до C++11) |
| Если деструктор сбросил обработчик завершения во время раскрутки стека, не определено, какой обработчик будет вызван, если раскрутка впоследствии приведёт к вызову | (начиная с C++11) |
Примечания
Если механизм обработчика не требуется, например, потому что он может увеличить размер двоичного файла из-за необходимости атомарных операций, при аварийном завершении программы предпочтителен прямой вызов std::abort.
Для максимально быстрого завершения программы можно использовать некоторые встроенные средства компилятора, например __builtin_trap (gcc, clang и icc) или __debugbreak (msvc).
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение согласно опубликованной версии | Исправленное поведение |
|---|---|---|---|
| LWG 2111 | C++11 | эффект вызова std::set_terminate во время раскруткистека отличается от C++98 и нарушает работу некоторых ABI | сделан неопределённым |
См. также
тип функции, вызываемой std::terminate (определение типа) |
|
| вызывает аварийное завершение программы (без очистки) (функция) |
|
|
(C++26) | приостанавливает выполнение программы при вызове (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/error/terminate