회사에 있는 ros2로 뭔가를 만들고 있었는데

애플리케이션이 종료될 때 문제가 생겼다.

기존에는 Debug + LeakSanitizer를 이용하지 않아서 발견하지 않은 문제였다.

문제가 되는 코드는 대충 다음과 같다.

std::unordered_map<ERROR_CODE_T, RMW_ERRORCODE_T> g_errorMappingTable
{ { ... }, { ... }, { ... }, }; ERROR_CODE_T GetErrorCode(RMW_ERRORCODE_T error)
{ return g_errorMappingTable[error]; } bool IsSupported(RMW_ERRORCODE_T error) { return g_errorMappingTable.count(error) > 0; }


에러코드를 보니 unordered_map의 소멸자가 호출되었는데 unordered_map을 참조하는 함수들이 호출되어서 생기는 문제였다.

전역변수니까 항상 제대로 값이 있을 것이란 믿음이 있었는데, 그렇지 않았던 것같았다.

그래서 다음과 같이 변경해서 문제를 피했다.

std::shared_ptr<std::unordered_map<ERROR_CODE_T, RMW_ERRORCODE_T>> g_errorMappingTablePtr
{new std::unordered_map<ERROR_CODE_T, RMW_ERRORCODE_T>
{ { ... }, { ... }, { ... } }}; ERROR_CODE_T GetErrorCode(RMW_ERRORCODE_T error) { auto errorMappingTablePtr{g_errorMappingTable}; if(errorMappingTablePtr == nullptr) return 0; return errorMappingTablePtr->at(error); } bool IsSupported(RMW_ERRORCODE_T error) { auto errorMappingTablePtr{g_errorMappingTable}; if(errorMappingTablePtr == nullptr) return false; return errorMappingTablePtr->count(error) > 0; }