内存泄漏检测和定位

内存泄漏检测方法

通过_CrtSetDbgFlag() 方法或者_CrtDumpMemoryLeaks()

#include <crtdbg.h>
inline void EnableMemLeakCheck()
{
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
}

void  _tmain(int argc, _TCHAR* argv[])
{  
    EnableMemLeakCheck();   
    int *pi = new int[10];
    //delete[] pi;

    //_CrtDumpMemoryLeaks();

}  

通过_CrtSetDbgFlag() 可以在作用域结束位置,自动调用_CrtDumpMemoryLeaks()

输出如下
这里写图片描述

看网上说定义了_CRTDBG_MAP_ALLOC如下代码段, 可以识别出哪个文件哪行代码发生的泄漏,但我没试出来。。

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

内存泄漏定位

_CrtMemState //内存状态数据类型
_CrtMemCheckpoint //获取内存状态
_CrtMemDifference //比较两个内存状态是否发生了泄漏
_CrtMemDumpStatistics //输出统计信息

void  _tmain(int argc, _TCHAR* argv[])
{  
    EnableMemLeakCheck();//输出内存泄漏块信息,在走出作用域之前执行。
    _CrtMemState s1,s2,s3;
    _CrtMemCheckpoint(&s1);
    int *pi = new int[10];
    //delete[] pi;
    _CrtMemCheckpoint(&s2);

    if (_CrtMemDifference(&s3,&s1,&s2))
    {
        _CrtMemDumpStatistics(&s3);//输出统计信息
    }

}  

输出如下
这里写图片描述

如果对申请内存进行释放则,如下输出,不会有内存泄漏信息输出。

这里写图片描述

根据这种对照可以用于定位某段代码是否存在内存泄漏。

参考:
http://www.cnblogs.com/skynet/archive/2011/02/20/1959162.html#

猜你喜欢

转载自blog.csdn.net/writeeee/article/details/69683333