C++内存泄露检测

RT,重载new和delete,在里面加上自己的东东,申请内存的时候存放结果,释放的时候标记下,最后进行统计,未被标记的就是泄露掉的;由于这里记录的是内存地址,所以可以接着释放【程序内未处理】,机制类似Java的GC。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <assert.h>
#include <crtdbg.h>
#include <stack>
#include <vector>
#include <pzjay_cpy>
#include <new>
using namespace std;


class Memory
{
public:
	Memory(void* addr = NULL)
	{
		this ->addr = addr;
		this ->used = true;
	}
	~Memory()
	{
		delete addr;
	}
	void* addr;
	bool used;
};
class Cls
{
	int s;
public:
	Cls(){}
	~Cls(){}
};

//vector <void*> ptr(3);//STL声明的时候会调用new,一次性申请需要大小的内存,这里是3 * 4 = 12 bytes
void* ary[100];
static int cnt = 0;
//重载new[]
void * operator new[](size_t count) _THROW1(std::bad_alloc)
{        
	printf("new[], 总大小为:\t%d\n", count);
	return (operator new(count));
}
//重载new
void* operator new(size_t size) throw(bad_alloc)
{
	printf("new:\t%d Byte\n",size);
	void* m=  malloc(size);
	if(!m) puts("out of memory");
	printf("new @:\t0x%0x\n", (int*)m);
	ary[cnt ++] = m;
	return m;
}

//重载delete[]
void operator delete[](void* cnt) _THROW1(std::bad_alloc)
{
	/*
	数组内存布局
	|num|var[0]|var[1]|var[2]|var[3]|........|var[num-1]|
	申请数组,第一个位置放置的是数组大小,以方便delete[]在删除
	数组的时候判断什么时候停止
	*/
	printf("delete[], 总大小为:\t%d\n", *(int*)cnt);
	return (operator delete(cnt));
}
//重载delete,要加__CRTDECL,否则不让重载
void __CRTDECL operator delete(void* m) throw()
{
	printf("delete @:\t0x%0x\n",(int*)m);

	for(int i = 0; i < cnt; ++ i)
	{
		if(0 == (int*)m - (int*)ary[i])
		{
			ary[i] = NULL;
			break;
		}
	}
	free(m);
}

void memCheck()
{
	for(int i = 0; i < cnt; ++ i)
	{
		if(NULL != ary[i])
			printf("memory leak @:\t0x%0x\n", ary[i]);
	}
}

int main(int argc, char* argv[])
{
	{new int;}

	char* ch = new char;

	int* p = new int(7);
	delete p;

	Cls* s = new Cls;

	Cls* sa = new Cls[14];
	delete []sa;

	int* pi=new int[3];

	printf("\nmemory check...\n\n");
	memCheck();
	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值