C++内存泄露检测,具体参考以下的两篇文章。
文章一,浅谈C/C++内存泄露及其检测工具http://www.cnblogs.com/taoxu0903/archive/2007/10/27/939261.html
下面进行总结。
内存泄露,在程序中分配了一定的内存大小后,却没有释放,就会造成内存泄露。有四种分类:常发性、偶发性、一次性、隐式。隐式的,严格上并不算是内存泄露,因为最终程序会释放掉。但随着运行时间的增加,这部分的内存消耗越来越大,也会造成系统的崩溃。这是系统设计上的漏洞。
文章一里说明到怎么去检测内存泄露:
“
检测内存泄漏的关键是要能截获住对分配内存和释放内存的函数的调用。截获住这两个函数,我们就能跟踪每一 块内存的生命周期,比如,每当成功的分配一块内存后,就把它的指针加入一个全局的list中;每当释放一块内存,再把它的指针从list中删除。这样,当 程序结束的时候,list中剩余的指针就是指向那些没有被释放的内存。”
检测内存泄露,有几种方法。
【方法一:vc下支持的函数】
在文章二里,有详细的说明,有逐步完善的版本变更。
需要使用的是#include <crtdbg.h>里的几个函数。一个是
_CrtDumpMemoryLeaks(),说明当前情况下,何处有内存泄露。但是光调用这个,在debug状态下得到的调试信息并不够用,因为他没说明在哪里有问题。
所以要更新定义new这个宏,输出内存泄露的地址。网上说的很多,如在下面这个网站说到这个头文件的使用方法:
但实测,只需加上
#ifdef _DEBUG
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
#endif
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
#endif
这三行,更新定义的new已经可以输出内存泄露的具体位置。
如果是程序有多个出口,那么可以使用
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
当程序结束时,进行内存泄露检测。
如果需要弹出调试窗口,说明程序出错,那么可以使用#include <assert.h>的assert函数。还有atexit注册
终止函数(即main执行结束后调用的函数)
完整程序如下:
#include "stdafx.h"
#include<iostream>
#include <crtdbg.h>
#include <assert.h>
using namespace std;
#ifdef _DEBUG
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
#endif
void Exit()
{
int i = _CrtDumpMemoryLeaks();//有内存泄露时返回true
assert( i == 0 );
}
int _tmain(int argc, _TCHAR* argv[])
{
// 1,使用弹出窗口的方法
//atexit(Exit);
// 2,当程序结束时才检测
//_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
int* p = new int();
// 3, 检测当前情况
_CrtDumpMemoryLeaks();
return 0;
}
【方法二:外挂程序】
BoundsChecker采用一种被称为 Code Injection的技术,来截获对分配内存和释放内存的函数的调用。简单地说,当你的程序开始运行时,BoundsChecker的DLL被自动载入进 程的地址空间(这可以通过system-level的Hook实现),然后它会修改进程中对内存分配和释放的函数调用,让这些调用首先转入它的代码,然后 再执行原来的代码。BoundsChecker在做这些动作的时,无须修改被调试程序的源代码或工程配置文件,这使得使用它非常的简便、直接。
好像是在vc上用,在visual studio上没找到具体版本,就没有试了.....