下面是一些注意事项:

  (1)#define _CRTDBG_MAP_ALLOC 的作用

  如果不定义这个宏, C方式的malloc泄露不会被记录下来。

  (2)数字{108} {107}的作用

  表示第几次分配, 你可以通过_CrtSetBreakAlloc程序运行到预定次数时暂停,比如

int _tmain(int argc, _TCHAR* argv[])
{
    _CrtSetBreakAlloc(108);

    char* p = new char();
    char* pp = new char[10];
    char* ppp = (char*)malloc(10);

    _CrtDumpMemoryLeaks();

    return 0;
}

  (3)如果程序有多个出口或是有涉及到全局变量,可以通过_CrtSetDbgFlag 设置标志让程序退出时自动打印泄露,比如

int _tmain(int argc, _TCHAR* argv[])
{
    _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

    char* p = new char();
    char* pp = new char[10];
    char* ppp = (char*)malloc(10);

    return 0;
}

  (4)我们知道宏替代是粗暴的方式,所以尽量把下面new的替代宏放到每个Cpp里而不是放到一个通用的头文件中,实际上MFC也是这么做的

#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif

  (5)上面的operator new只能照顾到普通的new,实际上operator new是有任意多种重载方式,只需要确保第一个参数是表示大小。比如下面的placement new会编译失败,因为宏替代后格式不符合要求了,所以如果你的CPP用了非标准的new,不要加入new的检测宏了。

#include <new>

#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif


int _tmain(int argc, _TCHAR* argv[])
{
    _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

    char* p = new char();
    char* pp = new char[10];
    char* ppp = (char*)malloc(10);

    char d;
    char* p1 = new(&d) char('a');

    return 0;
}