C/C++의 atexit() 함수란?
atexit() 함수는 프로그램이 정상적으로 종료된 이후에 특정 함수를 자동으로 호출하기 위해 사용됩니다. 이때 호출되는 함수는 매개변수 없이 실행되며, 종료 처리(termination) 함수는 프로그램 내 어느 위치에서든 등록할 수 있습니다. atexit() 함수는 stdlib.h 헤더 파일에 선언되어 있으며, 일반적으로 exit() 함수가 호출된 뒤 또는 main() 함수가 return으로 끝날 때 등록된 함수들이 실행됩니다.
atexit() 함수의 문법
int atexit(void (*function_name)(void))
매개변수 설명
function_name − 프로그램 종료 시점에 호출될 함수를 의미합니다. 반환값이 없고(void) 매개변수도 없는(void) 형태의 함수 포인터만 전달할 수 있습니다.
예제 코드
다음은 C 언어에서 atexit() 함수를 사용하는 예제입니다.
#include <stdio.h>
#include <stdlib.h>
void func1 (void) {
printf("\nExit of function 1");
}
void func2 (void) {
printf("\nExit of function 2");
}
int main () {
atexit (func1);
printf("\nStarting of main()");
atexit (func2);
printf("\nEnding of main()");
return 0;
}실행 결과
Starting of main() Ending of main() Exit of function 2 Exit of function 1
코드 분석
위 프로그램에서는 main() 함수보다 먼저 func1과 func2 두 개의 함수가 정의되어 있습니다. 그리고 atexit() 함수를 통해 이 함수들을 종료 처리 함수로 등록한 뒤, main() 함수가 종료되기 직전에 등록된 함수들이 자동으로 호출됩니다.
핵심 코드는 다음과 같습니다.
atexit (func1);
printf("\nStarting of main()");
atexit (func2);
printf("\nEnding of main()");주목할 점은 출력 순서입니다. func1이 먼저 등록되었지만, 실제로는 나중에 등록된 func2가 먼저 호출됩니다. 이는 atexit()에 등록된 함수들이 LIFO(Last In, First Out, 후입선출) 방식으로 실행되기 때문입니다. 즉, 마지막에 등록된 종료 처리 함수부터 역순으로 호출됩니다. 이러한 특성 덕분에 리소스를 할당한 역순으로 해제 작업을 배치하여 안전하게 정리할 수 있습니다.