std::atexit
| 헤더 <cstdlib>
|
||
int atexit( /*c-atexit-handler*/* func );
int atexit( /*atexit-handler*/* func );
|
에 정의됨 (1) | (C++11까지) |
int atexit( /*c-atexit-handler*/* func ) noexcept;
int atexit( /*atexit-handler*/* func ) noexcept;
|
(C++11부터) | |
extern "C" using /*c-atexit-handler*/ = void();
extern "C++" using /*atexit-handler*/ = void();
|
(2) | (설명 전용*) |
func가 가리키는 함수를 정상적인 프로그램 종료 시 (std::exit() 또는 main 함수 반환을 통해) 호출하도록 등록합니다.
|
함수들은 정적 객체의 소멸 중에 역순으로 호출됩니다. A가 B보다 먼저 등록되었다면, A 호출 전에 B 호출이 이루어집니다. 동일한 순서 규칙이 정적 객체 생성자와 |
(C++11까지) |
|
함수들은 정적 저장 기간을 가진 객체들의 소멸 및 서로와 동시에 실행될 수 있으며, A의 등록이 B의 등록보다 시퀀스-이전(sequenced-before) 관계에 있었다면 B의 호출이 A의 호출보다 시퀀스-이전 관계가 되는 것을 보장합니다. 이는 정적 객체 생성자와 |
(C++11부터) |
동일한 함수가 여러 번 등록될 수 있습니다.
함수가 예외를 통해 종료되면 std::terminate가 호출됩니다.
atexit은 스레드 안전합니다. 여러 스레드에서 이 함수를 호출해도 데이터 경합이 발생하지 않습니다.
구현은 최소 32개의 함수 등록을 지원함이 보장됩니다. 정확한 제한은 구현에서 정의합니다.
매개변수
| func | - | 정상적인 프로그램 종료 시 호출될 함수에 대한 포인터 |
반환값
0 등록이 성공하면 0, 그렇지 않으면 0이 아닌 값입니다.
참고 사항
두 오버로드는 func 매개변수의 타입이 서로 다르기 때문에 구별됩니다 ( language linkage 는 해당 타입의 일부입니다).
예제
#include <cstdlib> #include <iostream> void atexit_handler_1() { std::cout << "At exit #1\n"; } void atexit_handler_2() { std::cout << "At exit #2\n"; } int main() { const int result_1 = std::atexit(atexit_handler_1); const int result_2 = std::atexit(atexit_handler_2); if (result_1 || result_2) { std::cerr << "Registration failed!\n"; return EXIT_FAILURE; } std::cout << "Returning from main...\n"; return EXIT_SUCCESS; }
출력:
Returning from main... At exit #2 At exit #1
참고 항목
|
비정상적인 프로그램 종료를 발생시킵니다 (정리 작업 없이)
(함수) |
|
|
정리 작업과 함께 정상적인 프로그램 종료를 발생시킵니다
(함수) |
|
|
(C++11)
|
완전한 정리 작업 없이 빠른 프로그램 종료를 발생시킵니다
(함수) |
|
(C++11)
|
std::quick_exit
호출 시 실행될 함수를 등록합니다
(함수) |
|
C documentation
for
atexit
|
|