std:: terminate
|
헤더 파일에 정의됨
<exception>
|
||
|
void
terminate
(
)
;
|
(C++11 이전) | |
|
[
[
noreturn
]
]
void
terminate
(
)
noexcept
;
|
(C++11 이후) | |
std::terminate()
는 다음과 같은 이유로 프로그램이 계속 진행될 수 없을 때 C++ 런타임에 의해 호출됩니다:
|
6)
std::unexpected
의 비기본 핸들러가 이전에 위반된 dynamic exception specification을 다시 위반하는 예외를 던지고, 해당 specification에
std::bad_exception
이 포함되지 않은 경우
|
(until C++17) |
|
7)
noexcept specification
이 위반된 경우 (이 경우 스택 풀기(stack unwinding)가 수행되는지 여부는 구현에 따라 정의됨).
8)
std::nested_exception::rethrow_nested
가 캡처된 예외를 보유하고 있지 않은 객체에 대해 호출된 경우.
9)
std::thread
의 초기 함수에서 예외가 발생한 경우.
10)
조인 가능한(joinable)
std::thread
가 소멸되거나 할당된 경우.
11)
std::condition_variable::wait
,
std::condition_variable::wait_until
, 또는
std::condition_variable::wait_for
가 사후 조건(postcondition)을 충족하지 못한 경우 (예: 뮤텍스 재잠금 시 예외 발생).
|
(C++11부터) |
| (since C++17) |
std::terminate()
는 프로그램에서 직접 호출될 수도 있습니다.
std::terminate
가 예외 발생으로 인해 호출될 때, 암시적 try/catch 핸들러가 활성화된 것으로 간주됩니다. 따라서
std::current_exception
을 호출하면 발생한 예외가 반환됩니다.
어떤 경우든,
std::terminate
는 현재 설치된
std::terminate_handler
를 호출합니다. 기본
std::terminate_handler
는
std::abort
를 호출합니다.
|
만약 소멸자가 스택 풀기(stack unwinding) 도중 terminate 핸들러를 재설정하고, 이후 풀기 과정에서
|
(until C++11) |
|
만약 소멸자가 스택 풀기(stack unwinding) 도중 terminate 핸들러를 재설정하면, 이후 풀기 과정에서
|
(since 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
에 의해 호출되는 함수의 타입
(typedef) |
|
|
비정상적인 프로그램 종료를 발생시킴 (정리 작업 없이)
(function) |
|
|
(C++26)
|
호출 시 실행 중인 프로그램을 일시 중지함
(function) |