<aside> 💡
다음 프레임의 Update 루프에서 이전 Scene을 안전하게 할당해제하는 방식으로 바꾸어 해결 </aside>
원인 발견
중단점을 찍고 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