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 동일). 정상적으로 종료까지 되는 것을 확인할 수 있습니다.

static_con_test_vs.png




g++에서 컴파일한 결과의 실행 결과입니다(g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2). 실행을 하게 되면 에러가 납니다.

static_con_test_gpp.png




똑같은 C++ 코드에 대해서 Visual Studio에서 컴파일을 하면 정상적인 종료가 되지만, g++에서 컴파일을 했을 때 에러(core dumped)가 나게 되는데 이에 대한 원인을 분석해 보세요.




소스코드 : static_con_test.zip