标签:
#include <iostream>
#include <malloc.h>
using namespace std;
struct MemNode
{
char *pname;//文件名
int line;//文件所在行
int size;//内存泄漏大小
MemNode *link;
};
MemNode *node=NULL;//定义的头节点.
void *operator new(size_t sz,const char *pname,int line)
{
size_t space = sz + sizeof(MemNode);
MemNode *p = (MemNode *)malloc(space);
p->pname=const_cast<char *>(pname);
p->line=line;
p->link=NULL;
p->size=sz;
if(node==NULL)
{
node=p;
}
else
{
p->link=node;
node=p;
}
p=p+1;
return p;
}
void * operator new[](size_t sz,const char *pname,int line)
{
size_t space = sz + sizeof(MemNode);
MemNode *p = (MemNode *)malloc(space);
p->pname=const_cast<char *>(pname);
p->line=line;
p->link=NULL;
p->size=sz;
if(node==NULL)
{
node=p;
}
else
{
p->link=node;
node=p;
}
p=p+1;
return p;
}
/////////////////////////////////////
void operator delete[](void *p)
{
MemNode *p1 = node;
MemNode *p2 = p1->link;
while(p1!=NULL)
{
if((node+1)==p)
{
free(node);
node=p2;
return;
}
if((p2+1)==p)
{
p1->link = p2->link;
free(p2);
return;
}
p1=p2;
p2=p2->link;
}
}
void operator delete(void *p)
{
MemNode *p1 = node;
MemNode *p2 = p1->link;
while(p2!=NULL)
{
if((node+1)==p)
{
free(node);
node=p2;
return;
}
if((p2+1)==p)
{
p1->link=p2->link;
free(p2);
return ;
}
p1 = p2;//1 2
p2 = p2->link;
}
}
void cheak()
{
// cout<<node->pname<<endl;
if(node!=NULL)
{
cout<<node->pname<<endl;
MemNode *p = node;
while(p!=NULL)
{
cout<<"\t泄漏内存地址:"<<p<<"\t行号:"<<p->line<<"\t大小:"<<p->size<<endl;
p = p->link;
}
}
else
{
cout<<"没有内存泄漏!"<<endl;
}
}
class text
{
public:
~text()
{
cheak();
}
};//此处实现比调用atexit()好多了。
text text1;//次对象在程序结束之后析构,并且在调动析构函数的同时会自动调动内存检测函数,cheak();
#define new new(__FILE__,__LINE__)//这2个宏定义可以获取文件名以及行号。
int main()
{
int *p = new int(10);
double *q = new double(100.0);
double *p1 = new double[10];
delete p;
delete q;
delete []p1;
return 0;
}
标签:
原文地址:http://blog.csdn.net/liuhuiyan_2014/article/details/44851435