2009년 04월 04일
한가지 실수, 한가지 고민
<실수 이야기>
멀쩡하게 만들어놓은 기능이 어느날 동작하지 않기 시작했습니다.
로직 상 바꾼 것도 없고, 아주아주 사소한 리팩토링이 있었는데 그걸 원인삼기는 무리였습니다.
그 사소한 리팩토링이란:
std::map으로 A컨테이너를 하나 쓰는데,
A [GetValue()] = ptr; 을 괜히 복사 하나 줄여보겠다고
A.insert(make_pair(GetValue(), ptr)); 로 바꾼 것이었습니다..
그런데 GetValue() 부분은 템플릿으로 감싸져 있어서 템플릿이 풀리다가 무언가 오동작할 수도 있지 않을까?란 근거없는 심증이 들어, 이렇게 바꿉니다
uint k = GetValue();
A.insert(make_pair(k, ptr));
앗 갑자기 기능이 동작합니다(?)
GetValue()는 side effect가 없는 const함수고, 전혀 저렇게 바꾼다고 의미도 바뀔 이유가 없는데 말이죠.
괜히 컴파일러 탓을 해보고, 템플릿이 이상하다는 둥 별 난리를 다 떱니다.
std::map의 insert는 같은 key값이 있으면 value를 갱신하지 않는다는, 이미 예전에 알고 있던 사실을 잊어버린 채..
이미 GetValue()에 해당하는 key값에 NULL pointer가 value로 박혀있던 것이죠. 그래서 ptr 설정이 안되었던 것입니다.
참고로, k = GetValue()를 밖으로 빼서 동작한 건 데이터가 초기화되어서 insert 실패가 안 났던 것이었습니다-_-
간만에 자괴감드는 코딩 실수를 하니 기분이 상큼하군요(?)
--
<고민 이야기>
포커 영화 라운더스에, "니가 앉은 포커 테이블에서, 30분이 지나도 호구가 안 보이면 바로 니가 호구다" 라는 대사가 나옵니다.
입사 후 30일이 지났는데 우리 팀 개발자 중에 호구가 보이지 않습니다...
# by | 2009/04/04 01:55 | Programming | 트랙백 | 덧글(7)






☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
고민이야기는 좀 무섭군요. 저도(이하생략)
GPG스터디에서 'insert가 불필요한 복사가 적다'라는 내용을 보고 무작정 한 게 패인..
2. 토닥토닥...