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