1.分配空间

2.记录内存块信息

3.调用构造函数(类型萃取)

//#include<iostream>
//#include<string>
//#include<list>
//#include<assert.h>
//using namespace std;
//struct BlockInfo
//{
//	void* _ptr;
//	string _file;
//	int _line;
//	BlockInfo(void *ptr, const char*file, int line)
//		:_ptr(ptr)
//		, _file(file)
//		, _line(line)
//	{}
//};
//list<BlockInfo> BlockList;
//void* Alloc(size_t size, const char*file, int line)
//{
//	void* ptr = malloc(size);
//	if (ptr)
//	{
//		BlockInfo  b(ptr, file, line);
//		BlockList.push_back(b);
//	}
//	return ptr;
//}
//void  Dalloc(void *ptr)
//{
//	free(ptr);
//	//[)
//	list<BlockInfo>::iterator it = BlockList.begin();
//	while (it != BlockList.end())
//	{
//		if (it->_ptr == ptr)
//		{
//			BlockList.erase(it);
//			return;
//		}
//		++it;
//	}
//	assert(false);
//}
//void Print()
//{
//	cout << "内存泄漏的内存块" << endl;
//	list<BlockInfo>::iterator it = BlockList.begin();
//	int i = 1;
//	while (it != BlockList.end())
//	{
//		printf("【%d】 ptr:%p file:%s line:%d\n",i, it->_ptr, it->_file.c_str(), it->_line);
//		++it;
//		++i;
//	}
//}
//template<class T>
//T *__NEW(size_t num, const char* file, int line)
//{
//	T *ptr = (T*)Alloc(sizeof(T)*num, file, line);
//	if (TypeTraits <T>::__IsPODType().Get())
//		return ptr;
//	else
//		return new(ptr) T;
//}
//template<class T>
//void __DELETE(T *ptr)
//{
//	if (!TypeTraits <T>::__IsPODType().Get())
//		ptr->~T();
//	Dalloc(ptr);
//}
//template<class T>
//T *__NEW_ARRAY(size_t num,const char* file, int line)
//{
//	size_t size = sizeof(T)*num;
//	T* ptr = NULL;
//	if (TypeTraits <T>::__IsPODType().Get())
//	{
//		ptr = (T*)Alloc(size, file, line);
//		return ptr;
//	}
//	else
//	{
//		size += 4;
//		ptr = (T*)Alloc(size, file, line);
//	    *((int*)ptr) = num;
//		T* cur = (T*)((int*)ptr+1);
//	    for (size_t i = 0; i < num; i++)
//		{
//			new(&cur[i])T;//如果是基本类型则不执行,直接跳过
//		}
//		return cur;
//	}
//	
//}
//template<class T>
//void __DELETE_ARRAY(T* ptr)
//{
//	if (TypeTraits <T>::__IsPODType().Get())
//	{
//		Dalloc(ptr);
//	}
//	else
//	{
//		int num = *((int*)ptr - 1);
//		for (int i = 0; i < num; i++)
//		{
//			ptr[i].~T();
//		}
//		Dalloc((void*)((int*)ptr - 1));
//	}
//	
//}
//struct __TrueType
//{
//	bool Get()
//	{
//		return true;
//	}
//};
//
//struct __FalseType
//{
//	bool Get()
//	{
//		return false;
//	}
//};
//
//template <class _Tp>
//struct TypeTraits
//{
//	typedef __FalseType   __IsPODType;
//};
//
//template <>
//struct TypeTraits< bool>
//{
//	typedef __TrueType     __IsPODType;
//};
//
//template <>
//struct TypeTraits< char>
//{
//	typedef __TrueType     __IsPODType;
//};
//template <>
//struct TypeTraits< int>
//{
//	typedef __TrueType     __IsPODType;
//};
//
//#define NEW(type) __NEW<type>(1,__FILE__,__LINE__)
//#define DELETE(ptr) __DELETE(ptr)
//#define NEW_ARRAY(type,num)  __NEW_ARRAY<type>(num,__FILE__,__LINE__)
//#define  DELETE_ARRAY(ptr)  __DELETE_ARRAY(ptr)//模板类型根据传过去参数自己推演类型
//#include<iostream>
//using namespace std;
//#include"Singleton.hpp"
////基本类型
//void Test1()
//{
//	int *p1 =NEW(int);
//	int *p2 =NEW(int);
//	int *p3 =NEW(int);
//	*p1 = 1;
//	DELETE(p1);
//	DELETE(p2);
//	DELETE(p3);
//}
////自定义类型
//void Test2()
//{
//	string *s1 =NEW(string);
//	*s1 = "abcd";
//	cout << s1->c_str() << endl;
//	string *s2 = NEW(string);
//	*s2= "erty";
//	cout << s2->c_str() << endl;
//	DELETE(s1);
//	DELETE(s2);
//}
////基本类型数组
//void Test3()
//{
//	int *p1 = NEW_ARRAY(int, 10);
//	*p1 = 2;
//	p1[1] = 3;
//	p1[9] = 10;
//	int *p2 = NEW_ARRAY(int, 10);
//	DELETE_ARRAY( p1);
//	DELETE_ARRAY( p2);
//}
////自定义类型数组
//void Test4()
//{
//	string*  p1 =NEW_ARRAY(string, 5);
//	p1[0] = "abc";
//	p1[1] = "def";
//	p1[2] = "xxx";
//	p1[3] = "lll";
//	p1[4] = "www";
//	cout << p1->c_str() << endl;
//	DELETE_ARRAY(p1);
//}
//int main()
//{
//Test4();
////Test5();
////登记一个函数在main函数执行结束以后执行,函数限制void Func(void)
//atexit(Print);
//system("pause");
//return 0;
//}