实验内存泄露的检测

来源:互联网 发布:mac版谷歌dhc插件下载 编辑:程序博客网 时间:2024/05/20 12:25

[ 转载请注明来自CoderJeff的CSDN博客:http://blog.csdn.net/coderjeff/article/details/46474689,谢谢!]


参考文章:浅谈C++中内存泄露的检测


实验心得:

1. 除了最后使用Exit函数的方法外,前面的方法都需要在调试状态下,即,只按F5,才能检测出泄露的位置,否则,如果Ctrl+F5,output中无法显示相应信息。理论上来讲,Ctrl+F5也符合_DEBUG的定义,但不知为什么总是失败。待查。


2. 在1的情况下,下面两种写法都行。

_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);


3. 最后使用Exit函数的方法,并不能指示出泄露的位置,只能提示assert(i==0)的位置,也就是说,无论泄露的地方有多少,只会指示Exit函数内部一个地方。比如下面的代码:

#include "stdafx.h"

#include <new>

#define _CRTDBG_MAP_ALLOC   
#include <stdlib.h>    
#include <crtdbg.h>
#include <assert.h>
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif


void Exit()
{
int i = _CrtDumpMemoryLeaks();
assert(i == 0);
}


void func()
{
int *p = new int; //泄露位置1
}


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

//atexit(Exit);

int *p = new int[4]; //泄露位置2
func();

return 0;
}


采用1和2中的方法,可以准确指示出”泄露位置1“和”泄露位置2“,但如果用atexit(Exit),只会指示assert(i==0)的位置。


实验环境:VS2013 (符合C++11的编译器)



0 0
原创粉丝点击