• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

DBConnectionPool 소멸자에서 오류가 발생합니다..

23.11.26 00:10 작성 23.11.26 21:50 수정 조회수 251

0

왜 오류가 발생하는지 이해가 가질 않습니다.

GameServer.cpp에서 db내용 넣는부분과 추출하는부분만 확인하려고 return 0; 을해서 바로 빠져나왔는데요

 

DBConnectionPool이 소멸되는 시점에 Clear 해주는데 이때 WRITE_LOCK을잡으려하는데 Lock이 없어지는 거같습니다

 

코드 그대로 복사해봐도 동일한 오류가 나오는데 이유가 있을까요?

 

main에서 return을 중간에해서 종료하는건 지금만든 서버 에서는 할필요가 없을거 같긴한데요 찝찝한 느낌이 있어서 질문 드립니다..

 

 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.11.28

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

DBConnectionPool의 소멸자에서 오류가 발생하는 경우, 소멸자 로직에서 리소스 해제 과정 중에 문제가 발생했을 가능성이 높습니다. 에러 메시지에서 msvcp140d.dll이 누락되었다고 나오며 이는 개발용 DLL로 Microsoft Visual C++ Redistributable의 디버그 버전에서 사용됩니다.

이 DLL이 시스템에 설치되어 있지 않거나, 올바른 버전이 설치되지 않았을 수 있습니다. Visual Studio의 재배포 가능 패키지를 설치하여 해결할 수 있습니다.

또한, 소멸자에서 WRITE_LOCK을 사용하여 잠금을 시도할 때 발생하는 문제는, 프로그램 종료 과정에서 이미 해제된 오브젝트나 리소스에 대한 접근을 시도하는 경우 발생할 수 있습니다. 동시성 관련 오류일 가능성이 있으며, 소멸자 내에서의 이러한 잠금 시도는 이미 소멸된 다른 객체의 자원을 사용하고자 할 때 발생할 수 있습니다.

main 함수에서 return 0;을 사용해 조기에 종료하는 것이 문제일 수도 있습니다. 쓰레드나 다른 리소스가 아직 정리되지 않은 상태에서 프로그램이 종료되어서, 그로 인한 동시성 문제나 리소스 접근 오류가 발생할 수 있습니다. 프로그램 종료 시에 모든 리소스가 올바르게 해제되고, 모든 쓰레드가 정상적으로 종료될 수 있도록 코드를 검토해야 할 필요가 있습니다.

정확한 원인 파악을 위해 다음과 같은 점검 사항을 확인해 보시기 바랍니다:

  1. 시스템에 msvcp140d.dll이 설치되어 있는지 확인하고, 없다면 Microsoft Visual C++ Redistributable을 설치합니다.
  2. 소멸자 내에서 사용하는 리소스와 객체가 정상적으로 접근 가능한 상태인지 확인합니다.
  3. 멀티 쓰레딩 환경에서 적절한 동기화가 이루어지고 있는지 검토합니다.
  4. main 함수에서의 조기 종료가 다른 리소스의 정리 과정에 영향을 주지 않도록, 프로그램 전체의 종료 시나리오를 재검토합니다.

추가적으로 디버깅을 통해 해당 오류가 발생하는 구체적인 실행 경로를 파악하고, 필요하다면 락을 사용하는 부분에 대한 로직을 수정해야 할 수도 있습니다.

찝찝한 느낌을 해소하기 위해서는 정상적인 프로그램 종료 프로세스를 확실히 하는 것이 중요하며, 이를 위해 위에서 언급한 점검 사항들을 하나씩 해결해 나가시길 바랍니다.