C++內存檢測(定位到確定地址,并且用hash表來保存提高了搜索效率)
#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; } </pre>
感想:記錄內存需要占用大量的內存,雖然在定位地址時加快了速度,是一種侵入式的方法,因為你重載了new及delete,需要引入大量源文件的頭部來滿足重載new及delete的需求.
本文由用戶 xwfw 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!