메모리누수 - 대응법(2)

2015. 7. 2. 15:37IT-개발/winapi 및 MFC

반응형

C++ 메모리 누수 체크 및 디버깅(펌)


C 또는 C++ 프로그램을 작성하다보면, 본인도 모르는 사이 메모리 누수가 발생한다. 그리고, 이 문제가 발생하는 코드를 찾고, 해결하는 것은 프로그램 실력이 부족한 본인과 같은 사람들에게는 쉽지 않은 일이다. 그래서, 이 글에서는 C++에서 메모리 누수의 발생여부를 확인하고 디버깅하는 방법을 정리해 보고자 한다.



  • 메모리 누수 체크

    일단 해당 프로그램의 main 함수가 있는 'cpp'  파일에 아래와 같은 부분을 추가한다.

         #include <crtdbg.h>

         #ifdef _DEBUG
         #define new new( _CLIENT_BLOCK, __FILE__, __LINE__ )
         #endif


    그리고, main 함수 내부에 다음과 같은 코드를 삽입한다.

         _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );


    위의 코드들을 모드 삽입한 후에 DEBUG 모드로 프로그램을 실행시키면 다음과 같은 두가지 결과 중 하나를 볼 수 있다.


      1) 메모리 누수가 발생한 파일과 line을 알려주는 경우.

      Detected memory leaks!
    Dumping objects ->
    C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
    normal block at 0x00780E80, 64 bytes long.
    Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
    Object dump complete.


      2) 메모리 누수가 발생한 파일이나 위치를 알려주지 않는 경우.

      Detected memory leaks!
    Dumping objects ->
    {18} normal block at 0x00780E80, 64 bytes long.
    Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
    Object dump complete.


    결과 1)과 결과 2) 모두 64 byte의 메모리 누수가 발생했음을 알 수 있다. 결과 1)의 경우는 알려주는 위치에 해당하는 메모리를 잘 따라가서 해지해주면 쉽게 해결된다. 하지만, 결과 2)의 경우는 한가지 과정을 더 거쳐야 메모리 누수가 발생하는 위치를 알 수 있다.


  • 메모리 누수 디버깅

    앞서 언급했듯이 결과 1)의 경우는 쉽게 문제 해결이 가능하다. 그렇다고 결과 2)가 나왔다고 좌절할 필요는 없다. ^^

    결과 화면내 중괄호{ } 내부에 있는 숫자( 결과 2)에서는 '18' )를 이용해서 메모리 누수가 발생하는 위치를 알 수 있다.


    main 함수내에 아래의 코드를 넣어준다.

      _crtBreakAlloc = 18 // 18은 결과 2)의 중괄호 내의 숫자


    위의 코드를 삽입한 후 DEBUG 모드로 프로그램을 실행시키면, 메모리 누수가 발생하는 지점에서 프로그램이 멈춘다. 그 위치에 해당하는 변수의 메모리를 잘 해지해주면 문제는 해결된다. ^^



    모든 프로그램이 메모리 누수없이 잘 동작했으면 좋겠지만, 사실 규모가 큰 프로그램을 작성 하다보면 그 것이 말처럼 쉽지 않다. 본인은 이 문제 때문에 매우 고생했지만, 이 글을 읽는 독자들은 그런 고생을 하지 않길 바랍니다. ^^