C++内存检测(定位到确定地址,并且用hash表来保存提高了搜索效率)
2015-04-18 10:13
246 查看
#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++ 程序的150个建议学习之建议35:使用内存池技术提高内存申请效率与性能
- C++检测和定位内存泄漏的技巧
- C/C++ 内存泄露检测 Visual Leak Detector 检测定位内存泄露 对malloc和new均适用
- c++程序员不可不知的101条经验-检测和定位内存泄漏的技巧
- C++ 检测内存泄露工具 -- Windows平台
- Windows下cmake编译caffe,实现纯C++版本MTCNN人脸检测和关键点定位
- 如何减少内存分配频率,提高程序运行效率
- 提高安卓APP开发效率、管理代码的架子(二):BaseProtocol(加载数据,访问本地, 访问服务器,保存本地)
- 使用list保存数据内存指针,在LIST大小大于5000后,push_back效率很低
- pandas 提高效率,降低内存的方法
- ASP.NET通过配置Web.config文件提高手动绑定数据库效率的一个简单方法,不用每次手动连接数据库地址,或者数据库地址变更时只改一处即可。
- C++实现获取DOTA玩家名称(反汇编查找指针地址和跨进程读取war3内存)
- VLD(C++内存检测工具学习2)
- VS检测内存泄漏,定位泄漏代码位置方法
- 一些提高工作效率的软件地址
- c++ 之 vector技巧&避坑&提高效率
- 如何提高C++效率
- Wince内存泄露检测工具Application Verifier的使用和如何快速定位泄露语句
- 暴力搜索内存空间获得 Api 的线性地址
- C++内存管理之一(检测内存泄露)