在VC下定位内存泄漏总结

来源:互联网 发布:宝贝标题关键词优化 编辑:程序博客网 时间:2024/05/16 07:32
对于如何快速找到和定位内存泄漏的问题,网上已经有很多相关的内容。在这里也就做一个总结。
 
1.如何发现内存泄漏。
 
         VC中检测内存泄漏的基本工具是调试器和 CRT 调试堆函数。为了使用调试堆函数,必须在要调试的程序中添加下面的语句:
Code:
  1. #define _CRTDBG_MAP_ALLOC    
  2. #include<stdlib.h>    
  3. #include<crtdbg.h>   

        必须保证上面声明的顺序,如果改变了顺序,可能不能正常工作寻找内存泄漏的原理只是改变了内存分配的接口,即在DEBUG版中,使用<crtdbg.h>的_malloc_dbg和_free_dbg取代标准的malloc和free函数。由于它们可以跟踪内存的分配和释放,从而可以检测动态分配的内存是否被释放。但是这只会在DEBUG版本中发生(当#define _DEBUG的时候),而Release版本仍使用标准的malloc和free功能。
  #define _CRTDBG_MAP_ALLOC表示使用CRT堆函数的相应的DEBUG版本这个定义不是必须的,但是没有它,内存泄漏报告中的信息不是很详细。

    一旦你已经添加了刚才的声明,你就能够通过在程序return前加入下面的代码来报告内存泄漏信息:
Code:
  1. _CrtDumpMemoryLeaks();   

 例如:

Code:
  1. #define _CRTDBG_MAP_ALLOC    
  2. #include<stdlib.h>    
  3. #include<crtdbg.h>  //依次加上以上语句   
  4.   
  5. #include <iostream>   
  6. using namespace std;   
  7.   
  8. int main()   
  9. {   
  10.     char* a = new char[2];   
  11.     a[0] = 'A';   
  12.     a[1] = 'B';   
  13.   
  14.     //delete[] a; //故意不delete   
  15.     _CrtDumpMemoryLeaks();  //检测并报告内存泄漏   
  16.     return 0;   
  17. }  
         当在DEBUG模式下运行程序时,在Output窗口的Debug页会显示如下内存泄漏的信息:
 
Detected memory leaks!
Dumping objects ->
{64} normal block at 0x00396A58, 2 bytes long.
 Data: <AB> 41 42
Object dump complete.

 

原创粉丝点击