상세 컨텐츠

본문 제목

init_seg({ compiler | lib | user | "section-name" [, func-name]} )

개발 환경/Window

by cepiloth 2018. 12. 21. 19:17

본문

728x90
반응형



init_seg 지시어란?


init_seg는 좀 특별한 지시어로, 초기화 코드가 실행되는 순서에 영향을 미치는 지시어나 코드 섹션을 지정한다. 초기화 코드가 실행되는 순서라는 것은 주로 전역 변수의 초기화를 의미하며, 대부분 클래스의 생성자 호출과 관련된다. 


VLD 에서 사용 하는 부분


 VLD(Visual Leak Detector)는 메모리 누수를 감지하는 라이브러리이다. vld는 메모리를 할당하는 new 연산자 등을 할당해서 메모리 할당을 기록한 뒤 프로그램 종료시 그 레퍼런스가 0 이상이면 메모리 누수를 보고한다. 


만약 vld보다 먼저 초기화 된 라이브러리가 있다면 VLD 라이브러리가 초기화되기 전에 메모리가 할당되었다가 프로그램 종료시 메모리가 해제되지 않고 종료되어 VLD 라이브러리가 메모리 누수를 감지 못할 수 있는 가능성이 생길 수 있다. 


 이런 가능성을 조금이라도 없애기 위해서 VLD 는 다른 라이브러리보다 우선적으로 초기화 될 수 있도록 컴파일러 지시어를 사용하고 있다.


vld.h 헤더 파일을 보면 다음과 같은 Linker Directive가 있는데 이 링커 명령어의 의미는 VisualLeakDetector 클래스에 있는 visualleakdetector라는 객체를 포함하라는 의미다.


1
#pragma comment(linker, "/include:?visualleakdetector@@3VVisualLeakDetector@@A"

cs



실제 VLD의 오브젝트 파일 중에 글로벌로 선언된 visualleakdetector 객체가 존재한다. 그리고 해당 객체가 존재하는 부분에도 지시어가 있는데 #pragma init_seg (compiler) 구문에 주목하자.


1
2
3
#pragma warning (disable:4074
#pragma init_seg (compiler) 
VisualLeakDetector visualleakdetector; 
cs


 보통 글로벌이나 정적 타입으로 선언된 변수나 객체들은 WinMain이나 Main 함수, 즉 엔트리 함수 진입 시 미리 초기화가 된다(C++의 특성이다).  그런데 여기서 한가지 문제가 있는데 그건 이러한 글로벌 객체들의 초기화 순서를 정할 수가 없다는 것이다. 


 따라서 어떤 글로벌 객체가 다른 글로벌 객체를 참조해서 초기화한다고 가정했을 때 다른 글로벌 객체가 아직 초기화되지 않았을 경우에는 문제가 발생의 소지가 있다. 



728x90
반응형

관련글 더보기

댓글 영역