一个很好的内存泄露跟踪的方法

来源:互联网 发布:网络使人更疏远的提问 编辑:程序博客网 时间:2024/06/02 15:51

只要把下面的代码定义到公共头文件中,这里定义一个类目的是在main函数执行之前,就执行这个函数

这样在开发环境的输出窗口基本上和MFC检查输出的结果差不多了

 

#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#endif

 


#ifdef _DEBUG
#define meMalloc(s)       _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define meCalloc(c, s)    _calloc_dbg(c, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define meRealloc(p, s)   _realloc_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define meExpand(p, s)    _expand_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define meFree(p)         _free_dbg(p, _NORMAL_BLOCK)
#define meMemSize(p)      _msize_dbg(p, _NORMAL_BLOCK) 
#define meNew new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define meDelete delete  // Set to dump leaks at the program exit.
#define meInitMemoryCheck() /
 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF)
#else
#define meMalloc malloc
#define meCalloc calloc
#define meRealloc realloc
#define meExpand _expand
#define meFree free
#define meMemSize _msize 
#define meNew new
#define meDelete delete 
#define meInitMemoryCheck()
#endif

class MemoryCheckInitializer
{
public:
 MemoryCheckInitializer()
 {
  meInitMemoryCheck();
 }
};
static MemoryCheckInitializer mci_;

 

 

 

如下面的输出结果

./Main.cpp(69) : {165} normal block at 0x003B9F88, 4 bytes long.
 Data: <A   > 41 00 00 00

只要点击那个输出行就会定位到当前的源代码

Data:后的<>内表示这段内存的字符数据,后面的时候16进 制数据

 

其实还可以用一些现成的类库,比如vld,这个是动态检测的,也可以用一些静态检测工具,不过静态检测功能有限!