Namespaces
Variants

std:: terminate

From cppreference.net
헤더 파일에 정의됨 <exception>
void terminate ( ) ;
(C++11 이전)
[ [ noreturn ] ] void terminate ( ) noexcept ;
(C++11 이후)

std::terminate() 는 다음과 같은 이유로 프로그램이 계속 진행될 수 없을 때 C++ 런타임에 의해 호출됩니다:

1) 예외가 발생 하고 잡히지 않는 경우 (이 경우 스택 풀기(stack unwinding)가 수행되는지는 구현에 따라 정의됨).
2) 예외 처리 메커니즘이 아직 포착되지 않은 예외를 처리하는 동안 직접 호출되는 함수가 예외를 통해 종료되는 경우 (예: 일부 지역 객체의 소멸자 또는 catch 절 매개변수를 구성하는 복사 생성자).
3) 정적 또는 thread-local (since C++11) 객체의 생성자나 소멸자가 예외를 발생시키는 경우.
4) std::atexit 또는 std::at_quick_exit (C++11부터) 에 등록된 함수가 예외를 발생시킵니다.
5) dynamic exception specification 이 위반되고 std::unexpected 의 기본 핸들러가 실행되는 경우
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부터)
12) 병렬 알고리즘 에 의해 호출된 함수가 잡히지 않은 예외로 인해 종료되고 실행 정책 이 종료를 명시하는 경우
(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 핸들러를 재설정하고, 이후 풀기 과정에서 terminate 이 호출되게 되면, throw 표현식 끝에 설치된 핸들러가 호출됩니다. (참고: 재 throw가 새로운 핸들러를 적용하는지 여부는 모호했습니다)

(until C++11)

만약 소멸자가 스택 풀기(stack unwinding) 도중 terminate 핸들러를 재설정하면, 이후 풀기 과정에서 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)