전역 객체

J·2024년 9월 19일

테스트

목록 보기
5/12
post-thumbnail

atExit ( MSDN )

함수는 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;
}

전역 객체의 [ 생성자 / 소멸자 / atExit에 등록한 함수 ]의 실행 시점 확인

생성자

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  

소멸자 / atExit에 등록된 함수.

main 함수의 종료 후에

_exit - _common_exit함수에서 atExit에 등록해놓은 함수들을 역순으로 실행시킨다.

왼쪽부터 호출됨을 확인하였다.

결과

profile
낙서장

0개의 댓글