티스토리 뷰
개발을 하다보면 메모리 릭을 해결해야하는데요.
보통 아래와 같은 생각을 하며 메모리 릭이 발생하지 않도록 개발을 할텐데,
코드가 길어질 경우 메모리 릭을 찾기가 쉽지 않습니다.
•new, malloc, calloc, realloc으로 할당 후 free, delete 해제 했는가?
•메모리 할당 후 정상적으로 해제하기전에 로직 분기로 빠져나가는 경우에도 메모리 해제 했는가?
•클래스의 경우 동작하면서 할당된 메모리를 소멸자에서 해제하고 있는가?
•목록이나 캐시에 저장된 데이터에 할당된 메모리가 목록이나 캐시에서 제거 시 해제 되는가?
•집합 저장소의 크기가 계속 커질 가능성이 있는가?
그래서 이번에는 어디서 메모리 릭이 발생하였는지 확인하는 방법들 중 하나를 소개해보려고 합니다.
CRT Debugging
이 방식은 _CrtDumpMemoryLeaks() 함수를 프로그램 종료 직전에 호출하여 확인하는 방식입니다.
프로그램이 종료되기 직전 _CrtDumpMemoryLeaks() 함수를 호출하고, 디버깅을 하면 아래 화면 처럼
메모리 릭을 발견했다는 문구와 함께 122라는 숫자를 반환하게 됩니다.
122라는 숫자는 _CrtDumpMemoryLeaks() 함수의 반환값으로 memory allocation number를 의미합니다.
그러면 해당 부분을 알기 위해 _CrtSetBreakAlloc() 함수에 parameter로 122라는 값을 넣어주고 다시 실행하면
메모리 릭이 발생한 부분에서 중단하게 됩니다.
이러한 방식으로 메모리 릭을 찾을 수 있습니다.
만약, 프로그램이 여러군데에서 종료하는 로직이라면 _CrtSetDbgFlag() 함수를 사용함으로써 해결할 수 있는데요.
(parameter에 플래그값을 주어야하는데 MSDN을 참고하세요!)
이 함수는 프로그램 종료시 자동으로 _CrtDumpMemoryLeaks() 함수를 호출하기 때문입니다.
'windows' 카테고리의 다른 글
WaitForMultipleObjects (0) | 2020.01.10 |
---|---|
[windbg] 명령어 정리 (0) | 2018.09.19 |
[windbg] 심볼패스 설정, 덤프파일 분석 (1) | 2018.09.07 |
DuplicateHandle() - 오브젝트 핸들 복사, 현재 프로세스의 진짜 핸들 (0) | 2018.07.23 |
[windows] wininet 사용법과 예제 (0) | 2018.07.12 |
- Total
- Today
- Yesterday
- handshake
- 정렬 알고리즘
- DATABASE
- WinDbg
- windows
- 안드로이드
- 운영체제
- 스프링부트
- C++
- frameLayout
- listview
- 알고리즘
- OS
- C
- 백준알고리즘
- 퀵정렬
- 윈도우
- debug
- layout
- Android
- 이진탐색트리
- 스프링
- 네트워크
- BOJ
- HTTP
- ConstraintLayout
- adapter
- 백준
- RelativeLayout
- LinearLayout
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |