C++通用内存检查

分享到:
由map的升序排列和折半查找想到可以解决一些实际的问题,比如堆内存的管理
#include <cstdio>
#include <map>
#define MEM_NEW(T,n)			mem_alloc<T>(n, __TIME__, __FILE__, __LINE__)
#define MEM_DELETE(p)			if(p)\
                                    {\
                                        mem_free(p);\
                                        p = NULL;\
                                    };
#define MEM_CHECK()			mem_check()
struct AllocInfo
{
	const char*		time;
	const char*		file;
	int			       line;
};
std::map<void*,AllocInfo> g_UserMem;
/*
*使用模板函数为了new的时候明确类型从而调用构造函数 
*明确返回此类的对象指针不必类型转换
*/
template<typename T>
T* mem_alloc(int _size,
 const char* _time,
 const char* _file,
 const int	_line)
{
	void* p = static_cast<void*>(new T[_size]);
	if(p)
	{
AllocInfo _Info = {_time,_file,_line};
g_UserMem.insert(make_pair(p,_Info));
return static_cast<T*>(p);
	}
	else
	{
return NULL;
	}
}
/*
*使用模板函数为了delete时明确类型从而调用析构函数 
*找到key对应的内存地址返回迭代器清除容器成员
*/
template<typename T>
void mem_free(T* _point)
{
	delete[] _point;
	g_UserMem.erase(g_UserMem.find(static_cast<void*>(_point)));
}
void mem_check()
{
	printf("----------[Memory Check]----------\n");
if(!g_UserMem.size())
	{
printf("Memory have all been released\n");
return;
	}
printf("Exist memory hasn't be freed:\n");
std::map<void*,AllocInfo>::iterator it_map = g_UserMem.begin();
	for(;it_map!=g_UserMem.end();++it_map)
	{
if(it_map->first)
{
printf("Memory Allocation Time:[%s]\n\t%s - Line:%d\n",it_map->second.time, it_map->second.file, it_map->second.line);
}
	}
}

由于C++的模版不支持头文件和CPP文件分离 所以以上函数定义在头文件中

下面是测试代码

将平时的new和delete操作替换成宏函数即可,在程序退出前检查

#include <iostream>
#include "MemCheck.h"
using namespace std;
class A
{
public:
	A()
	{
cout<<"A"<<endl;
	}
~A()
	{
cout<<"~A"<<endl;
	}
};
int main()
{
	A *p = MEM_NEW(A,1);
	MEM_DELETE(p);
	MEM_CHECK();
	getchar();
	return 0;
}

来自:http://my.oschina.net/mlgb/blog/262943

昵    称:
验证码: