본문 바로가기

C,C++

메모리 누수 (클래스 상속)

디버깅하면서 한참을 해맸던 경험을 쓴다.

visual studio로 프로젝트를 만들고 memory leak이 발생되었다는 warning 뜨길래 찾기 시작.


#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif


이런 메크로를 소스파일 마다 추가해서 해 봤지 그런데 찾아지는 것도 있지만 대다수 소스파일 이름은 나오지 않았다.


_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtDumpMemoryLeaks();
_CrtSetBreakAlloc(13952);

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 

Object dump complete.

이런 코드 넣어서 해봐도 어차피 index가 계속 바뀌기 때문에 찾기도 힘들고..

그중 마지막은 최고 난이도였던 것 같다. 사실 이것도 내 실수이지만 말이다.

어떤 클래스를 만들고 그것을 상속 받고는 그의 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