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;
}