C++內存檢測(定位到確定地址,并且用hash表來保存提高了搜索效率)

xwfw 9年前發布 | 859 次閱讀 C/C++

    #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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!