티스토리 뷰

windows

memory leak tool (1) _ CRT Debugging

아풀 2019. 12. 24. 17:19

개발을 하다보면 메모리 릭을 해결해야하는데요.

보통 아래와 같은 생각을 하며 메모리 릭이 발생하지 않도록 개발을 할텐데,

코드가 길어질 경우 메모리 릭을 찾기가 쉽지 않습니다.


new, malloc, calloc, realloc으로 할당 후 free, delete 해제 했는가?

메모리 할당 후 정상적으로 해제하기전에 로직 분기로 빠져나가는 경우에도 메모리 해제 했는가?

클래스의 경우 동작하면서 할당된 메모리를 소멸자에서 해제하고 있는가?

목록이나 캐시에 저장된 데이터에 할당된 메모리가 목록이나 캐시에서 제거 시 해제 되는가?

집합 저장소의 크기가 계속 커질 가능성이 있는가?


그래서 이번에는 어디서 메모리 릭이 발생하였는지 확인하는 방법들 중 하나를 소개해보려고 합니다.


CRT Debugging

이 방식은 _CrtDumpMemoryLeaks() 함수를 프로그램 종료 직전에 호출하여 확인하는 방식입니다.

이 함수를 통해서 leak 존재 여부를 확인할 수 있습니다.
주의해야할 점은, 해당 함수를 호출하기 전 시점으로 해제되지 않은 메모리 영역을 알려주므로
delete 함수 이전에 호출된다면, leak으로 감지할 수 있습니다.

예를 들어, 아래와 같이 메모리 할당만 하고 해제를 안하는 간단한 예제가 있습니다.


프로그램이 종료되기 직전 _CrtDumpMemoryLeaks() 함수를 호출하고, 디버깅을 하면 아래 화면 처럼

메모리 릭을 발견했다는 문구와 함께 122라는 숫자를 반환하게 됩니다.



122라는 숫자는  _CrtDumpMemoryLeaks() 함수의 반환값으로 memory allocation number를 의미합니다.

그러면 해당 부분을 알기 위해 _CrtSetBreakAlloc() 함수에 parameter로 122라는 값을 넣어주고 다시 실행하면

메모리 릭이 발생한 부분에서 중단하게 됩니다.




이러한 방식으로 메모리 릭을 찾을 수 있습니다.


만약, 프로그램이 여러군데에서 종료하는 로직이라면 _CrtSetDbgFlag() 함수를 사용함으로써 해결할 수 있는데요.

(parameter에 플래그값을 주어야하는데 MSDN을 참고하세요!)

이 함수는 프로그램 종료시 자동으로 _CrtDumpMemoryLeaks() 함수를 호출하기 때문입니다.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함