함수는 atexit 프로그램이 정상적으로 종료될 때 호출할 함수 func 의 주소를 전달합니다.
atexit를 연속적으로 호출하면 LIFO(후입선출) 순서대로 실행되는 함수의 레지스터가 만들어집니다.
전달된 함수는 매개 변수를 atexit 사용할 수 없습니다.
atexit 및 _onexit는 힙을 사용하여 함수의 레지스터를 저장합니다.
따라서 등록 가능한 함수의 수는 힙 메모리에 의해서만 제한됩니다.
- 또한 리턴 값은 성공 시 0, 실패 시 0이 아닌 값을 반환한다.
#include <iostream>
class Test
{
public:
static void D()
{
std::cout << "D 호출\n";
}
Test() {
std::cout << "Test 생성자 \n";
atexit(D);
}
~Test() { std::cout << "Test 소멸자 \n"; }
};
void F()
{
std::cout << "F호출 \n";
}
Test test;
int main()
{
//atexit(Test::D);
atexit(F);
return 0;
}
main 함수가 시작되기 전에, __initterm이라는 함수 내부에서 실행되며, 생성자의 호출 후에 atExit 함수에 소멸자를 등록한다.
00FB1002 EC in al,dx
00FB1003 B9 34 54 FB 00 mov ecx,offset test (0FB5434h)
00FB1008 E8 E3 00 00 00 call Test::Test (0FB10F0h)
00FB100D 68 20 26 FB 00 push offset `dynamic atexit destructor for 'test'' (0FB2620h)
00FB1012 E8 A5 09 00 00 call atexit (0FB19BCh)
00FB1017 83 C4 04 add esp,4
00FB101A 5D pop ebp
00FB101B C3 ret
main 함수의 종료 후에
_exit - _common_exit함수에서 atExit에 등록해놓은 함수들을 역순으로 실행시킨다.

