프로그램을 종료할 때 왜 에러가 나는지 원인을 찾아 보세요.
글쓴이: gilgil / 작성시간: 일, 2011/10/09 - 6:35오후
보통 로그를 관리하는 Log 클래스와 어플을 관리하는 App 클래스는 Singleton pattern으로 하나만 생성해서 사용하는 것이 일반적인 경우가 있습니다. 이러한 경우, Singleton 객체간의 의존선이 존재할 때, 나중에 프로그램이 종료될 때 예상치 못한 에러가 야기될 수 있습니다. 아래 코드를 보고 프로그램 종료시 에러가 왜 나는지 예측해 보세요. ^^
#include <stdio.h> #include <string.h> class Log { FILE* fp; private: Log() { fp = fopen("test.log", "wb"); } virtual ~Log() { fclose(fp); fp = NULL; } public: void write(const char* msg) { fwrite(msg, 1, strlen(msg), fp); }; public: static Log& instance() { static Log g_log; return g_log; } }; class App { private: App() { //Log::instance().write("App::App\n"); } virtual ~App() { Log::instance().write("App::~App\n"); } public: void start() { Log::instance().write("App::start\n"); } static App& instance() { static App g_app; return g_app; } }; int main() { App::instance().start(); return 0; }
Forums:
~Log() 가 먼저 호출되고 나서 ~App() 가
~Log() 가 먼저 호출되고 나서 ~App() 가 호출되나보죠?
전역변수일때 dtor 불리는 순서는 어떻게 정해지나요?
======== 서명 =======
주거지는 www.indidev.net 입니다.
그게 문제의 핵심입니다. ^^
1. global 객체
global 객체들 생성
main 함수 실행
global 객체들 해제.
보통 이렇게 되구요, 먼저 생성된 놈들이 나중에 해제가 됩니다.
2. static 객체
staitc으로 선언을 하면 조금 복잡해 지는데요, static으로 선언된 객체들도 main 이후에 해제가 됩니다. 프로그램을 실행하면서 접근되지 않는 static 객체는 생성도 되지 않고, 당연히 해제도 되지 않습니다.
global 객체들 생성
main 함수 실행(static 객체들 생성)
static 객체들 해제.
global 객체들 해제.
3. 상기 코드
주석을 단 부분(App:App)에서 주석을 빼는 것과 빼지 않는 것에 대해 객체 해재 순서가 달라 집니다. 자세한 작동 방식에 대해서는 저도 조금 더 검토를 해 봐야 할 것 같습니다.
www.gilgil.net
호응이 별로 없네요. ㅎㅎ
규모가 좀 되는 프로젝트를 하다가 수만라인되는 곳에서 버그 발견하느라 X줄을 탔었고, 이를 쉽게 정리해서 글을 올려 봤는데 별로 반응이 없네요. ㅠㅠ
데브피아에도 같은 글을 올렸습니다. 댓글을 보시면 자세히 나와 있으니 참고하시기 바랍니다. ^^
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=52&MAEULNO=20&no=50684
www.gilgil.net