Memorymanager.h #include<iostream> using namespace std; struct BlockInfo { void* _ptr; std::string _file; int _line; BlockInfo(void* ptr=0,const char* file="",int line=0) :_ptr(ptr) ,_file(file) ,_line(line) {} }; template<class T> T* __NEW(size_t size,const char* file,int line) { T* ptr=(T*) Alloc(size,file,line); return new(ptr)T; } template<class T> void __DELETE(T* ptr) { ptr->~T(); Dealloc(ptr); } template<class T> T* __NEW_ARRAY(size_t num,const char* file,int line) { T* ptr=Alloc(sizeof(T)*num+4,file,line) *(int*)ptr=num; ptr=(int*)ptr+1; for(i=0;i<num;++i) { new(&ptr[i].T()); } return ptr; } template<class T> void __DELETE_ARRAY(T* ptr) { int* selfPtr=(int*)ptr-1; size_t num=*selfPtr; for(size_ti=0;i<num;++i) { ptr[i].~T(); } } #define NEW(type) __NEW<type>(sizeof(type),__FILE__,__LINE__) #define DELETE(ptr) __DELETE(ptr) #define NEW_ARRAY(type,num) __NEW_ARRAY(sizeof(type)*num+4,__FILE__,__LINE__); #define DELETE_ARRAY(ptr) __DELETE_ARRAY(ptr); test.cpp #include<iostream> using namespace std; #include"MemoryManager.h" #include<list> #include<assert.h> std::list<BlockInfo> BlockLists; void* Alloc(size_t size,const char* file,int line) { void* ptr=malloc(size); if(ptr) { BlockInfo info(ptr,file,line); BlockLists.push_back(info); } return ptr; } void Dealloc(void* ptr) { free(ptr); if(ptr) { std::list<BlockInfo>::iterator it=BlockLists.begin (); while(it!=BlockLists.end()) { if(it->_ptr==ptr) { BlockLists.erase(it); return; } ++it; } assert(false); } } void print() { std::list<BlockInfo>::iterator it=BlockLists.begin (); while(it!=BlockLists.end()) { printf("ptr:%p,\nfile:%s,\nline:%d\n",it->_ptr ,it->_file.c_str() ,it->_line ); it++; } } void Test1() { /*int* p1=NEW(int); int* p2=NEW(int); DELETE(p1);*/ int* p1=NEW(int,4); int* p2=NEW(int,8); DELETE(p1); print(); } int main() { Test1(); system("pause"); return 0; }
原文:http://760470897.blog.51cto.com/10696844/1753224