인프런 커뮤니티 질문&답변

오늘의논리님의 프로필 이미지
오늘의논리

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

DB Connection

클라연동 질문드립니다.

작성

·

277

·

수정됨

0

안녕하세요 루키스님 강의를 따라하면서 클라를 콘솔이 아니라 winapi를 이용해 연동에 성공했는데요.(싱글톤으로 서버 세션을 만듬)일단 연결이 된걸 확인했으나 클라에서 창을 닫고 나가면 deque헤더에서 액세스위반 크래쉬가 나더라구요.

그래서 디버깅을 열심히 해보니 클라가 나갈때 CoreGlobal의 소멸자가 호출되고 그중에 SendBuffer매니저를 지워줄때 문제가 생기더라구요. 그래서 혹시몰라 CoreGlobal 에 delete 하는 부분을 없애봐도 프로그램이 종료 되면

SendBufferManager::PushGlobal함수 호출 ->SendBufferManager::Push 함수 호출 되고 나가는 과정에서 Lock이 문제가 발생했습니다..

아무리 제가 찾아도 문제를 못찾겠어서 기존에 만들어주신 더미클라이언트에선 콘솔을 닫을때 코어글로벌 소멸자호출을 확인하니까 아예 호출이 안되는걸 확인했고 이 문제를 해결하려고 여러방면으로 시도를 해봤는데 잘 되지않아서 질문드립니다..

서버를 열지않은상태에서 클라를 닫을때 크래쉬가 안나는걸 봐선 클라문제는 아닌거같은데 어떻게 해결하는게 좋을까요?

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

루키스님 강의를 따라하시며 발생한 클라이언트 종료 시의 크래시 문제에 대해 질문해주셨군요. std::deque와 관련된 액세스 위반 크래시 이슈는 주로 메모리 해제와 관련된 문제에서 발생합니다. 클라이언트에서 창을 닫을 때 디버깅을 통해 CoreGlobal의 소멸자 호출 과정에서 SendBufferManager의 메모리 해제 부분에서 문제가 생기는 것을 확인하셨다고 합니다.

이와 관련해 몇 가지 점검해볼 수 있는 사항들을 제안드립니다:

  1. 멀티스레딩 환경에서의 동기화 처리: 언급하신 Lock 문제는 멀티스레딩 환경에서 객체에 동시에 접근할 때 발생할 수 있습니다. SendBufferManagerPushPushGlobal 함수 호출 과정에서 동기화 처리가 제대로 이루어졌는지 확인해보세요.

  2. 소멸자에서의 안전하지 않은 리소스 해제: 객체의 소멸자에서 다른 객체나 자원을 해제할 때 의존성 문제로 인해 발생할 수 있습니다. 클라이언트 종료 시 CoreGlobal의 소멸자가 다른 중요한 리소스를 먼저 해제하고 나서 SendBufferManager를 해제하는지 순서를 점검해보세요.

  3. 예외 처리: IDE에서 보여진 예외 메시지와 관련해, 예외가 발생할 수 있는 부분에서 적절한 예외 처리가 구현되었는지 확인해보세요. 이미 존재하는 예외와 관련된 메시지로 보아, 예외가 중복으로 발생하거나 예외 처리가 적절히 이루어지지 않을 수 있습니다.

해당 문제를 해결하기 위해서는 멀티 스레드 환경에서의 동기화 처리, 객체의 의존성 및 해제 순서, 그리고 예외 처리 상황을 꼼꼼히 확인해보시기 바랍니다.

추가적으로, 문제 해결에 도움이 될 수 있는 관련 코드나 상황을 더 자세히 알려주시면, 더 구체적인 해결 방안을 제시할 수 있을 것 같습니다.

오늘의논리님의 프로필 이미지
오늘의논리

작성한 질문수

질문하기