2019. 2. 17. 15:29
728x90

<요약>

전처리문
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>

누수 확인
_CrtDumpMemoryLeaks();

할당 지점 브레이크
_crtBreakAlloc = 할당번호;

메모리 상태 체크
_CrtMemState 구조체에 담기
_CrtMemCheckpoint(&구조체변수이름); 으로 체크


전처리문으로 다음 내용을 추가한다.
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>

메모리 누수를 확인할 시점에 아래 함수를 작성한다.
_CrtDumpMemoryLeaks();

_CrtDumpMemoryLeaks()은 메모리 누수가 있는 경우 1을 리턴, 없을 경우 0을 리턴한다.
메모리 누수에 대한 상세한 정보는 디버그 창에서 확인할 수 있다.

{166}은 메모리 할당 번호
at 뒤에 있는 0x0007A828은 메모리 주소
16 bytes long은 누수된 메모리 크기
Data: 뒤에 있는 내용은 메모리 내용이다.

_CrtDumpMemoryLeaks()가 실행되는 시점에 메모리 누수 여부를 체크한다.
프로그램 전체에 대해 확인하고 싶다면 프로그램이 종료되는 부분에 작성해두도록 한다.

누수가 발생하는 메모리 할당 번호에서 디버깅 중단점이 발생하기 원한다면 해당 메모리의 할당시점보다 이전 시점에 아래 내용을 작성해두면 된다.
_crtBreakAlloc = 메모리 할당 번호;
그러면 아래와 같이 메모리 할당 번호에 해당하는 지점에서 브레이크 포인트가 걸린다.


메모리 누수가 얼마나 일어나는가에 대해 콘솔에서 확인을 해보고 싶은 경우에는 _CrtMemState 구조체를 이용해보는 것도 방법일 수 있다.
_CrtMemState는 다음과 같이 구성되어 있다.

#define _MAX_BLOCKS      5
typedef struct _CrtMemState
{
    struct _CrtMemBlockHeader* pBlockHeader;
    size_t lCounts[_MAX_BLOCKS];
    size_t lSizes[_MAX_BLOCKS];
    size_t lHighWaterCount;
    size_t lTotalCount;
} _CrtMemState;

메모리 상태를 체크할 시점에
_CrtMemCheckpoint(&구조체 변수 이름) 함수를 사용하면 해당 시점의 메모리 정보가 구조체에 입력된다.

이를 통해 특정 시점 전 후의 상태를 기록하여 이 둘을 비교하면 메모리 누수가 어느정도 발생했는지 파악할 수 있다.
구조체 구성 중 lCounts는 메모리에 할당된 변수의 개수, lSizes는 메모리에 할당된 용량의 크기를 나타낸다.


참고 자료: https://docs.microsoft.com/ko-kr/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2017

728x90
Posted by 아야카