'포인터'에 해당되는 글 1건
- 2006/05/15 경험담 - 잘못 된 포인터 사용에 의한 버그
잘못된 포인터 사용에 의해서 버그가 일어났다.
포인터는 꼭 메모리가 할당된 것을 가르킨다는 것을 전제하에 이용해야 한다.
잘못된 예)
LPDWORD lpFileSizeHigh;
DWORD fileSize = GetFileSize(hSearch,lpFileSizeHigh);
문제점 -
DWORD GetFileSize(
HANDLE hFile,
LPDWORD lpFileSizeHigh
);
이 것을 보고, lpFileSizeHigh에 LPDWORD 값을 넘긴게 잘못이었다.
LPDWORD lpFileSizeHigh; <- 이것은 포인터만 생성됐고, 포인터가 가리키는 것이 없다.
즉, 메모리 할당이 안되어있다. 그래서 lpFileSizeHigh도 쓰레기 값으로 메모리를 가리키고 있다.
GetFileSize에 저 포인터를 넘기면서 lpFileSizeHigh가 쓰레기 주소값을 가지고 있으므로
어디를 변경시킬지 모른다는 것이다.
그런데 치명적인 주소는 아니었는지 프로그램은 다운되지 않고 사소한 동작의 오류만 있었다.
그래서 저것을
DWORD lpFileSizeHigh;
DWORD fileSize = GetFileSize(hSearch,&lpFileSizeHigh);
으로 바꾸니 문제가 해결 되었다.
이 문제는 가끔은 잘 되고 가끔은 잘 안된다는 것이었다.
치명적이지 못한 버그이기에 무엇이 문제인지 파악하기 힘들었었다.
어떻게 보면 간단한 문제지만 실수로 넘기기 쉬운 부분이다.
즉, 포인터를 사용할때는 항상 할당된 주소를 이용해야 한다는 것을 염두에 두고 프로그래밍을 해야한다.


