삽질로 배우는 STL 기초 개념?

제목이 낚시...인듯한데 생각나는 제목이. -_-;

다음은 버그가 있는 코드입니다. 버그의 원인을 찾아보세요.
inline void AddData(vector<Foo>& vn, Foo& fu) 
{
vn.push_back(fu);
}

{
vector<Foo> vecFoo;
//...
//적당히 vecFoo에 개체를 채워넣는다.
//
size_t n = vecFoo.size();
for (size_t i = 0; i < n; ++i) {
Foo &p = vecFoo[i];
if (p.dwType < 10) {
AddData(vecFoo, p);
p.dwType += 10;
}
}
}

분명, 테스트할 때만 해도 아무 문제 없던 프로그램.
그런데 실제로 프로그램이 실무에 들어가자 프로그램이 죽어버리는 치명적인 에러 발생.
확인해보니 테스트 때 vecFoo에 들어있는 개체 수를 500개 정도 넣어두고 저 루프에 들어가면 아무 문제가 없는데, 몇개라고 단정 지어 말할 수는 없지만 일정 갯수... 그러니까 한 600개 쯤? 이상이 되니 힙이 깨지는 에러가 발생하는 것이었다.

도대체 나는 무엇을 잘못한 것일까요?

힌트 :
vecFoo를 선언한 후, vecFoo.reserved(10000); 식으로 미리 vecFoo에 들어갈 최대갯수 이상으로 영역을 넉넉하게 할당해보니 문제가 발생하지 않았음.
하지만 이게 궁극적인 해결책이라고는 보이지 않는데에에...?



음음; 먼 예전에 짜놓고는 오늘에야 힙 깨지는거 확인하고 수정한 버그였습니다. 그래도 원인을 금방 찾아냈으니, 기분은 상큼.
뭐. 인터넷이란건 참 좋은 것 같습니다.
굳이 게시판에 질문을 적지 않더라도 조금만 머리 굴려 검색해보면 문제의 실마리를 찾아낼 수 있으니까요.

... 아무튼 오늘의 삽질 로깅이었습니다.

정답은 다음 이시간에! ... 랄까 음 저와 비슷한 경험 하신 분이 계실 것 같기도 한데 말이죠.

by nvu | 2007/12/27 14:25 | 트랙백 | 핑백(2) | 덧글(4)

트랙백 주소 : http://rin.nvyu.net/tb/1688996
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at ahastudio님의 글 - .. at 2007/12/27 23:39

... 0 metoo 메모리 재할당을 할 때는 기존의 주소를 참조하는 녀석에 주의해야 한다. 아니, 그 이전에, STL을 사용할 때는 자동으로 메모리 재할당이 일어날 수 있다는 사실을 잊지 말아야 한다. - 댓글로 달기 뭣해서 핑백이 걸 ... more

Linked at 다녀오세요♡ : 삽질로 배우는.. at 2007/12/28 15:43

... 삽질로 배우는 STL 기초 개념? 의 解편입니다. 이전 글을 보시지 못한 상태에서 내가 스스로 코드의 버그를 밝혀내겠소 같은 생각을 하는 분이 계시...려나 모르겠군요. -_ ... more

Commented by Sikuru at 2007/12/27 14:35
에... 그렇다고 힙이 깨지는 것 자체에 뭔가 문제가 있는 것 아닐까나요 ? ;
많이 리저브 되었다고 해서 안깨지는것도 이상하구요...

안깨진다기보다는 넓게 잡았으니 그 안에서 구르던 딩굴던...이라는 느낌도 문득...?
Commented by nvu at 2007/12/27 15:29
그쵸그쵸? 저도 그게 참 이상하다 싶어서 삽질을 ... 했는데ㅠㅠ;
말씀하신대로 reserve를 넉넉히 해두면 힙이 깨지지 않는 것은 이상...
하실지는 모르겠지만 어디까지나 힌트구요, 실제로 그러했습니다. -_-;;;;
어쨌든 문제는, 코드 안 다른 곳에 있었습니다.
Commented by 에이쥬어 at 2007/12/27 17:53
n.dwType < 10

이 부분이 아닐지.

여긴 사실 컴파일 에러가 날 부분이 아닌가 싶은데.
Commented by nvu at 2007/12/27 17:55
앗 코드 옮겨적으면서 실수 했습니다. 죄송죄송.
n.dwType 이 아니라 p.dwType 이 맞습니다. ...;;;

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶