Spec-Zone.ru › C++

std::terminate

Определено в заголовке <exception>
void terminate();
(до C++11)
[[noreturn]] void terminate() noexcept;
(с C++11)

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

1) брошено исключение и оно не перехвачено (в этом случае поведение по поводу разворачивания стека определено реализацией)
2) функция, непосредственно вызываемая механизмом обработки исключений во время обработки исключения, которое ещё не перехвачено, завершается с помощью исключения (например, деструктор какого-либо локального объекта или конструктор копирования, конструирующий параметр обработчика исключения)
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 во время разворачивания стека, и разворачивание позже привело к вызову terminate, то будет вызван обработчик, установленный в конце выражения throw. (Примечание: было неоднозначно, применяются ли новые обработчики при повторной обработке)

(до C++11)

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

(с C++11)

Параметры

(нет)

Возвращаемое значение

(нет)

Примечания

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

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

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

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

DR Применено к Поведение при публикации Правильное поведение
LWG 2111 C++11 влияние вызова set_terminate во время разворачивания стека отличается от C++98 и нарушает некоторые ABI сделано неопределённым

См. также

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

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

Spec-Zone.ru

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