天天看点

重载New和Delete检测内存泄漏

#include <iostream>
#include <vector>
#include <numeric>
#include<algorithm>
#include <stack>
#include <string>
#include <map>

using namespace std;
map<void*, pair<char*, int>> my_map;

class A
{
public:
	int a = 1;
};
void * __cdecl operator new(unsigned int size, const char *file, int line)
{
	void* p = malloc(size);
	my_map[p] = pair<char*, int>(const_cast<char *>(file), line);
	return p;
};
void __cdecl operator delete(void *p)
{
	my_map.erase(p);
	free(p);
};
#define new new(__FILE__,__LINE__) //用__FILE__, __LINE__记录new的位置

int main()
{

	auto tmp = new A;
	cout<<tmp->a;
	delete tmp;
	return 0;
}
           

感谢小木木提供的代码

在C/C++中指针给编码带来的极大的方便,但是同时由于分配的指针需要编程人员自行释放内存,因此容易造成内存泄漏,C++中自带的new/delete本身没有提供内存泄漏检测的功能,不过我们可以重载这两个函数来追踪内存的分配和释放,以此来检测程序是否出现了内存泄漏。算法的思想是在new一块内存时将该块内存的地址以及出现的文件和行号信息记录到一个map数据结构中,以内存地址作为key。释放该内存时将map中的该记录删除,最后程序退出时从map结构中输出那些没有被释放的内存信息。

http://blog.csdn.net/hzyong_c/article/details/5949314

http://www.cnblogs.com/pangxiaodong/archive/2011/08/29/2158136.html

http://blog.csdn.net/realxie/article/details/7437855

继续阅读