#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;
}
感想:记录内存需要占用大量的内存,虽然在定位地址时加快了速度,是一种侵入式的方法,因为你重载了new及delete,需要引入大量源文件的头部来满足重载new及delete的需求.
C++内存检测(定位到确定地址,并且用hash表来保存提高了搜索效率)
最新推荐文章于 2023-10-12 16:49:24 发布