<aside> 💡

Scene 전환 시 프로그램이 종료되는 버그

원인

해결

중단점을 찍고 F10으로 프로그램 카운터를 따라가던 중 원인을 발견

현재 버튼을 누르면 다음 Scene으로 전환되는 콜백이벤트를 호출하도록 처리하였음. Scene의 동적할당 및 초기화까지는 문제가 없었음. 문제는 콜백이벤트였다는 점과 Scene전환 시 이전 Scene의 동적할당을 delete 시킨다는 점이었음.

우선 ChangeScene함수를 살펴보면 아래와 같이 delete 시킨다는 것을 확인 가능

void SceneManager::ChangeScene(SceneType newSceneType)
{
    if (m_pCurrentScene)
    {
        m_pPreviousScene = m_pCurrentScene;
    }

    // 새로운 씬 로드
    m_pCurrentScene = m_sceneLoader.LoadScene(newSceneType);

    // 이전 씬이 존재하면, Cleanup 후 삭제
    **if (m_pPreviousScene)
    {
        m_pPreviousScene->Cleanup();
        delete m_pPreviousScene;
        m_pPreviousScene = nullptr;
    }**
}

콜백이벤트 수행 종료 후 프로그램카운터가 가리키는 위치는 아래 소스코드와 같았음

void TitleScene::Update(float deltaTime)
{
    // ... 중략
    
    // 버튼 및 타이틀의 위치와 폰트 크기 업데이트
    if (m_pStartButton) {
        m_pStartButton->SetRect(startRect);
        m_pStartButton->SetFontSize(buttonHeight / 2);
        **m_pStartButton->Update(deltaTime);  // 프로그램 카운터는 이 부분을 가리킴**
    }
    if (m_pExitButton) {
        m_pExitButton->SetRect(exitRect);
        m_pExitButton->SetFontSize(buttonHeight / 2);
        m_pExitButton->Update(deltaTime);
    }
    if (m_pTitleText) {
        m_pTitleText->SetRect(titleRect);
        m_pTitleText->SetFontSize(titleHeight / 2);
        m_pTitleText->Update(deltaTime);
    }
}

F10을 통해 프로그램 카운터를 통해 문제를 발견할 수 있었음.

즉 콜백함수 종료 이후, **원래 수행하던 곳(이전 Scene)**으로 프로그램카운터가 돌아가는데

delete로 동적할당을 해제했으므로 원래 있던 곳의 메모리 참조는 Undefined Behavior