-
반환된 임시 개체 사용으로 인한 종종 프로그램이 터지던 문제프로그래밍/의문 2016. 6. 15. 21:50반응형
함수 GetID는 string 개체를 반환한다.
그리고 Execute 함수는 GetID로 받아온 string 내부 리소스 포인터를 반환하는 함수인 c_str()을 사용한다.
위 코드에서 무엇이 문제인지 짐작했는가? cBot.GetID()로 받아온 string 개체는 다음 라인에서 제거 된다는 것이다.
그러나 위 코드는 정상적으로 동작 "했었다" string은 분명 제거되었으나, 스택(또는 힙)에 남아있던 데이터가 지워지지 않고 남아있었기 때문이다.
그러다가 프로그램이 터진 후 문제를 찾는데, 좀처럼 찾기가 어려웠다.(20분은 걸린 듯 ㅡㅡ;)
ResetSession, ConnectServer까진 정상적으로 사용이 되었는데 뜬금 없이 ProcessLogin에서 터지네?
어? 근데 아까 strKeyID는 값이 멀쩡했는데 왜 값이 깨져있어?
코드를 되짚어보니 다름이 아니라... 스택이 지워지는 터졌다는 것을 캐치할 수 있었다.
위와 같은 구문은 이 외에도 여러군데 있었으며 앞으로 반환된 개체 사용에는 무효화가 될 수 있다는 걸 염두해야 할 것이다.
그리고 위 코드가 더 재밌을 이유는 cBot.GetID()의 예를 들려고 적었으나 cGameServerEndpoint.GetAddress()에도 임시 변수를 반환하는 코드이기 때문이다.
반응형'프로그래밍 > 의문' 카테고리의 다른 글
c++ 파일 저장 시 로케일로 인한 깨짐 문제 (2) 2016.07.05 InvalidOperationException "No current now" error (0) 2016.06.19 친구와 각자의 집에서 tcp 연결을 하려는데 연결이 안 되던 문제 (0) 2016.04.04 유니티 클라이언트 수신 처리 건 (0) 2016.03.30 유니티 json(JsonUtility) 송신 => c++서버 json 수신 (0) 2016.03.29