您的位置:首页 > 其它

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

2015-04-21 11:13 78 查看
#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: