태그 : 프로그래밍
AddData(vecFoo, p);힙 메모리가 깨지는 원인은 바로 저 부분에 있었습니다.
ASSERT(&p == &vecFoo[i]); //
p.dwType += 10;
아무튼;;;
설령 힙 에러를 내지 않는다 하더라도, &p에 들어간 값은 vector가 메모리 재할당 작업을 하는 순간 근거를 알 수 없는 값이 되어버립니다. 그렇게 되면 코드는 문제 없이 넘어갔다 해도 왜 이상한 값이 난데 없이 들어가 있나 하고 골머리를 썩히는 그런 일이 생기게 될테지요, 그렇게 되면 왜 데이터가 이상해지는걸까 원인을 몰라 코드 전체를 쑤시고 다녔을...지도 모른다고 생각하니 조금 무섭다... -_-;;;
아무튼 이 사건은 vector, deque은 포인터 덜 신경 써도 되니 좋은 것 같넹, 이라고 생각하고서 생각 없이 STL에 기대다가 보기 좋게 당한 꼴보기 좋은 케이스였습니다.
vector나 deque 같은 계열은 배열내 원소들의 수가 늘거나 줄어들거나 하는 경우 운 좋게 무효가 되지 않는 경우도 있지만 대부분 무효가 될거라고 상정해두고서 작업하는 것이 좋을 것 같습니다. 특히 멀티 스레드 기반 프로그램이라면 벡터 원소에 대한 포인터를 걸어놓고서 먼 미래에 참조하는, 그런 일이 생기지 않도록 더욱더 조심해야겠지요.
아 간만에 어딘지 모르게 영양가 있어 보이는 글을 적어보았더니 기분이 좋근영. ( -_-)
영양가 있는 부분이 어딘지 모르겠다... 는게 문제지만. ( -_-);;;;
# by | 2007/12/28 10:34 | 트랙백 | 핑백(1) | 덧글(2)
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;
}
}
}
# by | 2007/12/27 14:25 | 트랙백 | 핑백(2) | 덧글(4)

# by | 2007/12/26 17:57 | 트랙백 | 덧글(0)
◀ 이전 페이지 다음 페이지 ▶