디버깅하면서 한참을 해맸던 경험을 쓴다.
visual studio로 프로젝트를 만들고 memory leak이 발생되었다는 warning 뜨길래 찾기 시작.
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Detected memory leaks!
Dumping objects ->
{13952} normal block at 0x0A977EE8, 63 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
어떤 클래스를 만들고 그것을 상속 받고는 그의 instance를 만들었다.
그리고 리스트에 추가하고 관리하도록 했지.
그리고 사용하지 않을 때 리스트에 있는 모든 instance를 삭제하고 종료했지
아무리 봐도 틀린 곳이 없는데 왜 그럴까 찾아보는 중
결국 destructor 문제임을 찾아냈다.
원본 class에서 우선 destructor를 vritual로 선언하지 않았고 자식도 마찬가지였다.
debugging 해보니 무조건 부모의 destuctor만 호출되길래 역시나 virtual로 되어 있지 않았던 것이다.
그래서 실제로 할당할 때는 부모보다 큰 자신의 영역을 잡았지만 삭제할 때는
부모의 메모리 영역 만큼만 free한것으로 남은 것 같다.
어쨌거나 이래서 결국 leak 문제는 수정완료.
destructor에 virtual 붙이는 것 생활화하자. 굳이 상속해서 사용하지 않더라도. -.-;
'C,C++' 카테고리의 다른 글
STL ifstream read text file (0) | 2017.04.17 |
---|---|
Template Point Rect (0) | 2016.05.13 |