内存管理(不涉及hash管理)

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

青春不是年华,而是心境;青春不是桃面丹唇柔膝,

内存管理(不涉及hash管理)

相关文章:

你感兴趣的文章:

标签云: