内存泄露工具(用hash表实现)

  1. #include <iostream>  
  2. #include <malloc.h>  
  3. #include <string.h>  
  4. #include <stdio.h>  
  5. #define DefaultSize 7  
  6. using namespace std;  
  7. struct Node  
  8. {  
  9.     char *pname;//文件名字  
  10.     int line;//行号  
  11.     int size;//大小  
  12.     long long save;//存储地址ip  
  13.     Node *next;  
  14. };  
  15.   
  16. struct HashNode  
  17. {  
  18.   Node *adj;  
  19.     HashNode():adj(NULL){}//向量数组,保存指定向量。  
  20. };  
  21.   
  22. class HashList  
  23. {  
  24.     public:  
  25.     HashList()  
  26.     {  
  27.     }  
  28.     void Insert(Node *p)  
  29.     {  
  30.         int index = Find(p->save&((long long)0x111));  
  31.         p->next=data[index].adj;  
  32.         data[index].adj=p;  
  33.     }  
  34.     int Find(int x)  
  35.     {  
  36.         return x%DefaultSize;//获取存储下标。  
  37.     }  
  38. ~HashList()  
  39.     {  
  40.         Check();//进程结束时会调用析构函数,由此起到检测的作用。  
  41.     }  
  42.     void Check()  
  43.     {  
  44.         for(int i=0;i<DefaultSize;i++)  
  45.         {  
  46.             Node *p = data[i].adj;    
  47.             while(p!=NULL)  
  48.             {  
  49.                 printf("start address:%p",(int*)p->save);  
  50.                 //cout<<"start address :"<<std::hex<<p->save;  
  51.                 cout<<"  "<<"file name:"<<p->pname<<"  "<<"line number:"<<p->line<<"  "<<"what size:"<<"  "<<p->size;  
  52.                 cout<<endl;  
  53.                 p=p->next;  
  54.             }  
  55.         }  
  56.     }  
  57.     void Delete(int *p)  
  58.     {     
  59.         long long a = (int)p;     
  60.     #ifdef __DEBUG__  
  61.         cout<<a<<endl;//g++ -D __DUBUG__就会在执行时默认执行到这里来并且显示a的值,不然这个开关不会打开。  
  62.     #endif  
  63.         int index = Find(a&0x111);//取最后3位的值来确定下标。  
  64.         Node *q = data[index].adj;  
  65.         Node *m = NULL;   
  66.         while(q!=NULL)  
  67.             {     
  68. //              m=q;  
  69.                 if(q->save==a)  
  70.                     break;  
  71.                 m=q;  
  72.                 q=q->next;  
  73.             }  
  74.             if(m==NULL)  
  75.             {  
  76.                   
  77.                 data[index].adj=q->next;  
  78.                 free(q);  
  79.                 return;  
  80.             }  
  81.             if(q!=NULL)  
  82.             {  
  83.             m->next = q->next;  
  84.             free(q);  
  85.             }  
  86.     }  
  87.     private:  
  88.     HashNode data[DefaultSize];//向量数组,包含一个节点指针adj.  
  89. };  
  90. HashList list;  
  91. void *operator new(size_t sz,const char *pname,int line)  
  92. {  
  93.     Node *p = (Node *)malloc(sizeof(Node));  
  94.     p->pname = (char *)malloc(20);  
  95.     strcpy(p->pname,pname);  
  96.     p->size=sz;  
  97.     p->line=line;  
  98.     void *q = (void *)malloc(sz);  
  99.     p->save=(int)(q);//将地址转化为整形并且存储,在删除的时候会用到。  
  100.     list.Insert(p);  
  101.     return q;//返回的q使用。  
  102. }  
  103. void operator delete(void *p)  
  104. {  
  105.     list.Delete((int *)p);  
  106.     free(p);//这里要将p进行释放.  
  107. }  
  108. void *operator new [](size_t sz,const char* pname ,int line)  
  109. {  
  110.     Node *p = (Node *)malloc(sizeof(Node));  
  111.     p->pname = (char *)malloc(20);  
  112.     strcpy(p->pname,pname);  
  113.     p->size=sz;  
  114.     p->line=line;  
  115.     void *q = (void *)malloc(sz);  
  116.     p->save = (int)(q);  
  117.     list.Insert(p);  
  118.     return q;//反谁开辟内存大小。  
  119. }  
  120. void operator delete[](void *p)   
  121. {  
  122.     list.Delete((int *)p);  
  123.     free(p);//必须返回。  
  124. }  
  125. #define new new(__FILE__,__LINE__)//define new  
  126. int main()  
  127. {  
  128.     int *p = new int();  
  129.     int *q = new int();  
  130.     char *c = new char();  
  131.     int *p1 = new int[10];  
  132.     delete q;  
  133.     delete []p1;      
  134.     delete c;  
  135.     int *a = new int();   
  136.     return 0;  
  137. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值