Namespaces
Variants

std:: atexit

From cppreference.net
Utilities library
헤더 파일에 정의됨 <cstdlib>
(1)
int atexit ( /* c-atexit-handler */ * func ) ;
int atexit ( /* atexit-handler */ * func ) ;
(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 function 에서 반환될 때) 호출되도록 등록합니다.

이 함수들은 정적 객체들의 소멸 과정에서 역순으로 호출됩니다: A가 B보다 먼저 등록되었다면, B에 대한 호출이 A에 대한 호출보다 먼저 이루어집니다. 정적 객체 생성자들과 atexit 호출 사이의 순서에도 동일하게 적용됩니다: std::exit 참조.

(until C++11)

이 함수들은 정적 저장 기간을 가진 객체들의 소멸과 서로 동시에 호출될 수 있으며, A의 등록이 B의 등록보다 순서상 앞선 경우 B의 호출이 A의 호출보다 순서상 앞선다는 보장을 유지합니다. 정적 객체 생성자들과 atexit 호출 사이의 순서에도 동일하게 적용됩니다: std::exit 참조.

(since 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)
완전한 정리 작업 없이 빠른 프로그램 종료를 발생시킵니다
(함수)
std::quick_exit 호출 시 실행될 함수를 등록합니다
(함수)