关于内存泄漏检测的一些方法

    #define _CRTDBG_MAP_ALLOC  //显示内存块类型和内存块分配编号
    #include <crtdbg.h>

    ...........

     //在输出窗口查看内存泄漏信息,在程序结束前加入:


     _CrtDumpMemoryLeaks();  //退出程序位置固定时

     或者
     _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );// 当退出位置不固定时

    运行程序,看输出信息:

  

   

   

     output内存泄漏信息结构:
    1.内存分配的编号(大括弧中的数字)
    2.内存块的类型(普通型、客户端型、CRT型)
    3.16进制表示的内存位置
    4.内存块的大小
    5.前16bytes的内容

   

    可以指定编号,定位内存泄漏的位置,如在程序开始时加上:

    _CrtSetBreakAlloc(3442);

    再运行则在内存泄漏处停住。

    还有一种简单的检测一段代码是否有内存泄漏的方法:

    在要检测的代码前加:

     _CrtMemState s1, s2, s3;

     _CrtMemCheckpoint( &s1);

    在代码执行后加:

    _CrtMemCheckpoint( &s2);


    if ( _CrtMemDifference( &s3, &s1, &s2) ) 

        //若执行到此处则说明上面代码有内存泄漏

         _CrtMemDumpStatistics( &s3 );

posted @ 2010-11-29 16:36  毛志谦  阅读(270)  评论(0编辑  收藏  举报