Total Articles 494
Singleton Design Pattern을 소스 코드에 적용하던 도중에 Visual Studio와 g++ 컴파일러의 바이너리 코드 생성의 차이에 의해 고생(?)을 했던 경험이 있어서 문제의 형식으로 내어 봅니다.
A와 B라는 클래스가 있습니다. 2개의 클래스는 모두 다음과 같은 method를 가지고 있습니다.
- 생성자(constructor)
- 일반 함수(foo)
- 레퍼런스 인스턴스를 반환하는 함수(instance)
A클래스의 헤더 파일(a.h) 코드는 다음과 같습니다(B 클래스도 동일).
class A { public: A(); void foo(); static A& instance(); };
아래는 A클래스의 implementation 코드(a.cpp)이며 A생성자에서 B 클래스의 인스턴스에 접근을 하고 있습니다. B 클래스의 생성자에서도 동일하게 A클래스의 인스턴스에 접근을 하고 있습니다.
A::A() { B::instance().foo(); } void A::foo() { } A& A::instance() { static A a; return a; }
main 함수입니다.
int main() { A a; B b; }
VS에서 컴파일한 결과의 실행 결과입니다(VS2012 Debug or Release 동일). 정상적으로 종료까지 되는 것을 확인할 수 있습니다.
g++에서 컴파일한 결과의 실행 결과입니다(g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2). 실행을 하게 되면 에러가 납니다.
똑같은 C++ 코드에 대해서 Visual Studio에서 컴파일을 하면 정상적인 종료가 되지만, g++에서 컴파일을 했을 때 에러(core dumped)가 나게 되는데 이에 대한 원인을 분석해 보세요.
소스코드 : static_con_test.zip
[힌트]
1. vs와 g++의 컴파일러의 차이에 의한 것이 원인입니다.
2. printf와 같은 디버깅 코드로 원인을 알아 내기는 어렵습니다.