- #include <iostream>
- #include <malloc.h>
- #include <string.h>
- #include <stdio.h>
- #define DefaultSize 7
- using namespace std;
- struct Node
- {
- char *pname;//文件名字
- int line;//行号
- int size;//大小
- long long save;//存储地址ip
- Node *next;
- };
- struct HashNode
- {
- Node *adj;
- HashNode():adj(NULL){}//向量数组,保存指定向量。
- };
- class HashList
- {
- public:
- HashList()
- {
- }
- void Insert(Node *p)
- {
- int index = Find(p->save&((long long)0x111));
- p->next=data[index].adj;
- data[index].adj=p;
- }
- int Find(int x)
- {
- return x%DefaultSize;//获取存储下标。
- }
- ~HashList()
- {
- Check();//进程结束时会调用析构函数,由此起到检测的作用。
- }
- void Check()
- {
- for(int i=0;i<DefaultSize;i++)
- {
- Node *p = data[i].adj;
- while(p!=NULL)
- {
- printf("start address:%p",(int*)p->save);
- //cout<<"start address :"<<std::hex<<p->save;
- cout<<" "<<"file name:"<<p->pname<<" "<<"line number:"<<p->line<<" "<<"what size:"<<" "<<p->size;
- cout<<endl;
- p=p->next;
- }
- }
- }
- void Delete(int *p)
- {
- long long a = (int)p;
- #ifdef __DEBUG__
- cout<<a<<endl;//g++ -D __DUBUG__就会在执行时默认执行到这里来并且显示a的值,不然这个开关不会打开。
- #endif
- int index = Find(a&0x111);//取最后3位的值来确定下标。
- Node *q = data[index].adj;
- Node *m = NULL;
- while(q!=NULL)
- {
- // m=q;
- if(q->save==a)
- break;
- m=q;
- q=q->next;
- }
- if(m==NULL)
- {
- data[index].adj=q->next;
- free(q);
- return;
- }
- if(q!=NULL)
- {
- m->next = q->next;
- free(q);
- }
- }
- private:
- HashNode data[DefaultSize];//向量数组,包含一个节点指针adj.
- };
- HashList list;
- void *operator new(size_t sz,const char *pname,int line)
- {
- Node *p = (Node *)malloc(sizeof(Node));
- p->pname = (char *)malloc(20);
- strcpy(p->pname,pname);
- p->size=sz;
- p->line=line;
- void *q = (void *)malloc(sz);
- p->save=(int)(q);//将地址转化为整形并且存储,在删除的时候会用到。
- list.Insert(p);
- return q;//返回的q使用。
- }
- void operator delete(void *p)
- {
- list.Delete((int *)p);
- free(p);//这里要将p进行释放.
- }
- void *operator new [](size_t sz,const char* pname ,int line)
- {
- Node *p = (Node *)malloc(sizeof(Node));
- p->pname = (char *)malloc(20);
- strcpy(p->pname,pname);
- p->size=sz;
- p->line=line;
- void *q = (void *)malloc(sz);
- p->save = (int)(q);
- list.Insert(p);
- return q;//反谁开辟内存大小。
- }
- void operator delete[](void *p)
- {
- list.Delete((int *)p);
- free(p);//必须返回。
- }
- #define new new(__FILE__,__LINE__)//define new
- int main()
- {
- int *p = new int();
- int *q = new int();
- char *c = new char();
- int *p1 = new int[10];
- delete q;
- delete []p1;
- delete c;
- int *a = new int();
- return 0;
- }
内存泄露工具(用hash表实现)
最新推荐文章于 2021-07-17 23:27:55 发布