'memory leak'에 해당되는 글 2건

  1. 2007/11/07 MemoryLeak 을 찾아주는 AutoMemoryLeak 클래스
  2. 2007/07/31 7.30(월) C++ - finding memory leak (2)
1. AutoMemoryLeak.h
 => #include "AutoMemoryLeak.h" 를 해주기만 하면 출력창에 누수가 난곳을 출력해준다.
#if !defined (__AutoDetectMemoryLeak_h__)
#define __AutoDetectMemoryLeak_h__

#if defined(_MSC_VER) && defined (_DEBUG)
#define _CRTDBG_MAP_ALLOC // 메모리 누수를 탐지하기 위해 선언 해주어야 한다.
#include <crtdbg.h>
#if !defined (_CONSOLE)
#include <cstdlib> // for Consol Application
#endif

class __AutoDetectMemoryLeak
{
public:
    __AutoDetectMemoryLeak ()
    {
        _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF |
            _CRTDBG_LEAK_CHECK_DF);

        // Consol Application인 경우
#if defined (_CONSOLE)
        // Send all reports to STDOUT
        _CrtSetReportMode( _CRT_WARN,  
            _CRTDBG_MODE_FILE   );
        _CrtSetReportFile( _CRT_WARN,  
            _CRTDBG_FILE_STDOUT );
        _CrtSetReportMode( _CRT_ERROR, 
            _CRTDBG_MODE_FILE   );
        _CrtSetReportFile( _CRT_ERROR, 
            _CRTDBG_FILE_STDOUT );
        _CrtSetReportMode( _CRT_ASSERT,
            _CRTDBG_MODE_FILE   );
        _CrtSetReportFile( _CRT_ASSERT,
            _CRTDBG_FILE_STDOUT );


        /* new로 할당된 메모리에 누수가 있을 경우 소스상의
        정확한 위치를 덤프해준다.
        *  ※ _AFXDLL을 사용할때는 자동으로 되지만 CONSOLE
        모드에서 아래처럼
        * 재정의를 해주어야만 합니다.
        *    date: 2000-12-05
        */

#define DEBUG_NORMALBLOCK   new ( _NORMAL_BLOCK, __FILE__, __LINE__ )
#ifdef new
#undef new
#endif
#define new DEBUG_NORMALBLOCK

#else

        // Send all reports to DEBUG window
        _CrtSetReportMode( _CRT_WARN,  
            _CRTDBG_MODE_DEBUG  );
        _CrtSetReportMode( _CRT_ERROR, 
            _CRTDBG_MODE_DEBUG  );
        _CrtSetReportMode( _CRT_ASSERT,
            _CRTDBG_MODE_DEBUG  );

#endif

#ifdef malloc
#undef malloc
#endif
        /*
        * malloc으로 할당된 메모리에 누수가 있을 경우 위치
        를 덤프
        * CONSOLE 모드일 경우 crtdbg.h에 malloc이 정의되어
        있지만,
        * _AXFDLL 모드일 경우에는 약간 다른방식으로 덤프 하
        게된다.
        * date: 2001-01-30
        */

#define malloc(s) (_malloc_dbg( s, _NORMAL_BLOCK, __FILE__, __LINE__ ))
    }
};

// 몇 가지 초기화를 생성자를 통해 자동으로 해주기 위해 전역으로 선언한다.
static __AutoDetectMemoryLeak __autoDetectMemoryLeak;

#endif // if defined(_MSC_VER) && defined (_DEBUG)

#endif // __AutoDetectMemoryLeak_h__



7.30(월) C++ - finding memory leak

from Study/C++ 2007/07/31 14:32 view 1700716

// memory.cpp
#include
"memchk.h"

 

// finding memory leak

int main()

{

        int* p1 = new int;

        int* p2 = new int;

        int* p3 = new int;

 

        delete p2;

 

//      cout << __FILE__ << endl;     // 컴파일 하는 파일이름

//      cout << __LINE__ << endl;     // 컴파일 하는 LINE NO

 

        return 0;

}

 

//memchk.h

#include <iostream>

using std::cout;

using std::endl;       // .h 에서는 절대로 namespace를 통째로 열지마라!!(격언중하나)

 

#ifdef _DEBUG

 

struct MemInfo

{

        char name[256];        // 화일이름

        int  line;             // new를호출한line no

        void* addr;            // 할당한메모리주소

};

 

MemInfo mem[10000];  // 최대10000개의 메모리 할당을기록( linked list를 사용해도 됨 )

int count = 0;

 

void* operator new( size_t s, char* file, int line )

{

        void* p = malloc( s );

 

        // 배열에 할당정보를 기록한다.

        mem[count].addr = p;

        mem[count].line = line;

        strcpy( mem[count].name, file );

 

        ++count;

 

        return p;

}

 

void operator delete( void* p )

{

        for( int i = 0; i < count; i++ )

        {

               if( mem[i].addr == p )

               {

                       mem[i] = mem[count-1]; // i번째를 제거

                       --count;

                       break;

               }

        }

        // 배열에 없는 정보라면 에러처리를 하는 것도 좋은방법.

        free(p);

}

 

int MAIN();

 

void main()

{

        MAIN();

 

        if ( count == 0 )

        {

               cout << "NO Memory Leak" << endl;

               return;

        }

 

        cout << "Found " << count << " Memory Leak" << endl;

 

        for( int i = 0; i < count; ++i )

        {

               cout << "FILE : " << mem[i].name << endl;

               cout << "FILE : " << mem[i].addr << endl;

               cout << "FILE : " << mem[i].line << endl;

               cout << endl;

        }

}

 

 

// 꼭 외워 두세요. new에 인자를 더 보내주기 위한 좋은 방법

#define new new(__FILE__, __LINE__)

#define main MAIN

 

// C에 적용해보고 싶을때!!

#define malloc(x)      MyMAlloc( x, __FILE__, __LINE__ )

#define free(x)               MyFree(x)

 

#endif // _DEBUG

Tag | ,