본문 바로가기
C++

[C++] 메모리 누수 (memory leak)와 CRT 라이브러리

by Junk_Seo 2018. 1. 24.
반응형

메모리 누수

동적할당을 사용하여 메모리를 사용한 다음 이 메모리를 해제해주지 않으면 계속해서 남아있게 되고 나중에 실제 프로그램이 실행되는 중에 문제가 발생할 수 있습니다. 

이렇게 동적할당으로 메모리를 할당하고 메모리를 해제하지 않는 경우는 메모리 누수(memory leak)이라고 합니다.

하지만 컴파일러는 이를 error로 생각하지 않기 때문에 메모리 해제를 하지 않았다고 해서 error를 띄어주지 않습니다.  따라서 메모리 누수로 인해 문제가 발생하면 이를 찾기가 어렵습니다. 

따라서 이런 경우에는 CRT 라이브러리를 사용하여 메모리 누수를 찾아야 합니다.

CRT 라이브러리

메모리 누수를 탐지하기 위해서는 <crtdbg.h> 헤더를 포함해야 합니다. 

그리고 코드 실행의 맨 앞에

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

를 추가합니다. 

이다음에 디버깅을 하면 출력 창에 메모리 누수에 관한 내용을 출력해서 보여줍니다.

 

 

위 사진과 같이 동적할당한 다음 메모리를 해제하지 않고 디버깅을 하자 출력창에 메모리 누수에 관한 내용을 출력해주고 있습니다.

하지만 정확한 위치는 알려주지 않고 있죠.

메모리 누수가 발생한 동적할당 위치를 찾기 위해서는 위 코드에서 빨간 네모 안에 있는 숫자가 중요합니다.

그리고 다음과 같은 코드를 추가하면 됩니다.

_crtBreakAlloc = 64; OR _CrtSetBreakAlloc(64);

둘 중 하나를 추가하면 되는데, 64라는 숫자가 위 사진의 빨간 네모 안에 있는 숫자와 같다는 것을 알 수 있습니다. 이 숫자는 동적할당한 메모리의 할당 번호이며 이는 시스템에 따라서 다르게 나옵니다. 

 

이 코드를 또 추가한 뒤 디버깅을 하게 되면 메모리 누수가 발생한 동적할당의 위치에 중단점이 걸리게 됩니다.

 

메모리 누수가 발생한 경우 <crtdbg.h> 헤더를 추가한 뒤 코드의 맨 앞에 다음 코드를 추가합니다.

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

그리고 메모리 할당 번호를 얻은 다음 

_crtBreakAlloc = <메모리 할당 번호>OR _CrtSetBreakAlloc(<메모리 할당 번호>);

코드를 추가하여 위치를 찾으시면 됩니다.

 

반응형

'C++' 카테고리의 다른 글

[C++]Class 소멸자(Destructor)  (0) 2018.01.25
[C++]복사 생성자와 delete 키워드  (0) 2018.01.24
[C++]Reference 레퍼런스  (0) 2018.01.24
[C++]Class 생성자(Constructor)  (0) 2018.01.24
[C++]new delete 동적할당  (0) 2018.01.24