转 内存泄露检测,重载new

//mem_check.h
#ifndef MEM_CHECK_H
#define MEM_CHECK_H
#ifdef _DEBUG
//两个东西:重载new,重定义new参数
void* operator new(size_t size, const char *file_name,long line);
void* operator new[](size_t size, const char *file_name,long line);
void operator delete(void *);
void operator delete[](void *);
//重载完之后,new操作符的参数事实上还是一个,因此重定义一下new,使之有3个操作符
#define new new(__FILE__,__LINE__)
#endif
#endif

//mem_check.cpp
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
#ifdef _DEBUG
namespace {//匿名空间的使用
    struct info{
        void *ptr;
        const char *file_name;
        long line;
    };
    info ptr_list[1024];
    unsigned int ptrn=0;

    int find_ptr(void *p){
        for(int i=0;i<ptrn;i++){
            if(ptr_list[i].ptr==p)
                return i;
        }
        return -1;
    }

    void del_ptr(int i){
        while(i+1<ptrn){
            ptr_list[i]=ptr_list[i+1];
            i++;
        }
        ptrn--;
    }


    class process_end{
    public:
        ~process_end(){
            for(int i=0;i<ptrn;i++){
                cout<<ptr_list[i].file_name<<"  line:"<<ptr_list[i].line<<" memory leak"<<endl;
            }
        }
    };
    process_end pe;
}//匿名空间结束

void* operator new(size_t size, const char *file_name,long line){
    void *p=malloc(size);
    ptr_list[ptrn].ptr=p;
    ptr_list[ptrn].file_name=file_name;
    ptr_list[ptrn].line=line;
    ptrn++;
    return p;
}

void* operator new[](size_t size, const char *file_name,long line){
    return operator new(size,file_name,line);
}

void operator delete(void *p){
    int i=find_ptr(p);
    if(i>=0){
        free(p);
        del_ptr(i);
    }else{
        cout<<"delete unknown pointer"<<endl;
    }
}

void operator delete[](void *p){
    operator delete(p);
}
#endif

//main.cpp

#include <iostream>
#include "mem_check.h"//必须最后include
using namespace std;
int main(){
    int *p=new int;
    delete p;
    delete p;
    int *r=new int[5];
}



最后给一个介绍重载new new[] delete delete[]的页面
http://zhidao.baidu.com/question/31574989.html?fr=qrl&cid=866&index=4&fr2=query

posted on 2010-10-23 14:32  Jacky  阅读(503)  评论(0编辑  收藏  举报