Memorymanager.h
#include
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
T* __NEW(size_t size,const char* file,int line)
{
	T* ptr=(T*) Alloc(size,file,line);
	return new(ptr)T;
 
}
template
void __DELETE(T* ptr)
{
	ptr->~T();
	Dealloc(ptr);
}
template
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
void __DELETE_ARRAY(T* ptr)
{
  int* selfPtr=(int*)ptr-1;
  size_t num=*selfPtr;
  for(size_ti=0;i(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
using namespace std;
#include"MemoryManager.h"
#include
#include
std::list 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::iterator  it=BlockLists.begin ();
	   while(it!=BlockLists.end())
	   {
	       if(it->_ptr==ptr)
		   {
		        BlockLists.erase(it);
				return;
		   }
		   ++it;
	   }
	   assert(false);
	}
}
void print()
{
    std::list::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;
}