内存泄露工具(用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;
}
#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;
}
相关文章推荐
- vld 内存泄露检测工具vld的实现
- linux 内存泄露检测工具
- (转)javascript 内存泄露工具使用
- 介绍一个VC++下内存泄露检测工具
- MLeaksFinder:精准 iOS 内存泄露检测工具
- 性能优化之内存泄露(Memory Leak)常用分析工具(另3种)
- Java内存泄露分析和解决方案及Windows自带查看工具
- 内存泄露检测工具比较
- 好用的BUG、内存泄露捕捉工具 EurekaLog v6.0.11 Enterprise For D5-D2007 简体中文汉化版
- C#实现的系统内存清理工具
- AndroidStudio 内存泄露调试及MAT工具综合使用
- Android 内存泄露检测工具 LeakCanary
- MLeaksFinder:精准 iOS 内存泄露检测工具
- linux下内存泄露检测工具Valgrind介绍
- 内存泄露检查工具BoundsChecker的使用
- iOS开发笔记(五)Phone内存泄露:Leaks工具指引
- 内存泄露检测工具之DMalloc
- 什么是内存泄露?及25款内存泄露检测工具!
- 内存泄露检测工具(25款)
- 内存泄露检测工具比较