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