//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