#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; }
时间: 2024-10-08 00:03:40