C++大量的手动分配、回收内存是存在风险的,也许一个函数中一小块内存泄漏被重复放大之后,后掏空内存。
  这里介绍一种在debug模式下测试内存泄漏的方法。
  首先在文件的开头以确定的顺序写下这段代码:
  1 #define _CRTDBG_MAP_ALLOC
  2 #include <crtdbg.h>
  3 #include <stdlib.h>
  第1行定义了宏,实现一些内存分配函数向debug模式的映射。
  打开<crtdbg.h>我们可以找到这么一段代码:
  C++的内存泄漏检测1 #define NEW_WITH_MEMORY_LEAK_CHECKING new(_NORMAL_BLOCK,__FILE__,__LINE__) 2 #define new NEW_WITH_MEMORY_LEAK_CHECKING
  这里new采用的是VC++对operator new的一个重载,可以在<vcruntime_new_debug.h>中找到,这里不多讲了。
  完成以上两步之后,程序中new和delete回收的过程便被VC++监视了,在程序退出的地方采用
  1 _CrtDumpMemoryLeaks();
  便可以在“输出”窗口查看报告了。
  举个栗子
  1 #define _CRTDBG_MAP_ALLOC
  2 #include <stdlib.h>
  3 #include <crtdbg.h>
  4 #define NEW_WITH_MEMORY_LEAK_CHECKING new(_NORMAL_BLOCK,__FILE__,__LINE__)
  5 #define new    NEW_WITH_MEMORY_LEAK_CHECKING
  6
  7 int main()
  8 {
  9     auto p = new int[10];
  10     _CrtDumpMemoryLeaks();
  11     return 0;
  12 }
  C++的内存泄漏检测1 #pragma push_macro("new") 2 #undef new 3 //using the raw new 4 #pragma pop_macro("new")
  #pragma push/pop_macro将宏定义名压/弹栈,这里现将宏new压栈,保留原来的定义,之后取消定义,使用原生的new,使用完毕后弹栈恢复宏定义。