Game Develop

[C++] 싱글톤 사용시 주의점 본문

C++/C++

[C++] 싱글톤 사용시 주의점

MaxLevel 2021. 4. 1. 19:23

꼭 싱글톤 사용시 주의점이라기보단 혼자 삽질한부분이 싱글톤쪽이라 기록을 남겨놓는다.

포트폴리오 작업 도중, 플레이어쪽 코드에서 스택오버플로우가 발생해서 스택호출을 추적해본 결과

싱글턴 인스턴스 할당하는 부분이 재귀함수마냥 뺑뺑이 도는걸 발견했다.

전날 딱히 건드린게 없다고 생각하긴 했는데 찾아보니 몬스터 생성자에서 GM->Get()->GetPlayer() 부분을 호출했기 때문에 생긴 문제였다. 원래는 Update에 두었기 때문에 생성자 이후에 호출되서 상관이 없었는데, 포인터만 받아오면 되는 부분이라 프레임마다 호출시킬 필요가 없기때문에 생성자부분으로 옮겨놨었다.

그렇게 바꾸고 오늘 빌드했더니 Player쪽에서 스택오버플로우가 발생했다.

 

현재 프로그램 구조가 대략 빌드 시 GameManager 싱글톤 인스턴스가 생성된다.

인스턴스생성되는 과정에서(생성자가 실행되는 과정에서) player = new Player로 플레이어 메모리를 할당을 받고 바로 Monster를 할당받게 되는데 몬스터의 생성자가 실행되는 과정에서 GameManager의 인스턴스를 호출하는게 문제였다.

 

프로그램이 실행된 이후, 아직 GameManager의 인스턴스는 생성자가 끝까지 실행되지 않았다. 

보통 싱글톤을 작성할 경우 아래처럼 하는 경우가 많을 것이다. (맞다는게 아니라 일반적인? 경우)

 

static T* Get()
{
    if (instance == nullptr)
        instance = new T();
   

     return instance;
}

 

instance가 nullptr이면 할당을 받는건데, 위에 말했다시피 인스턴스가 제대로 할당받지 않은 상태에서 몬스터 생성자쪽에서 다시 Get()을 호출해버리기 때문에 또 GameManager 생성자부분이 또 실행되는것이다.

 

그렇게 되면 또 몬스터생성자가 호출->GameManager 생성자 호출-> 몬스터생성자 호출 -> ..... 이렇게 무한반복되는 과정에서 Player가 너무 많이 호출되서 문제가 생긴듯 했다.

 

원인을 찾고나니 너무 사소한거같아서 글을 남기기 창피했지만 내 기준으로 충분히 또 실수할거같아서 글을 남긴다.