2、源文件
#define MAX_FILE_LEN 128
//须要实现的功能
//1 将分配的内存信息写入文件
//2 将释放的内存信息写入文件
//3 将分配的内存信息都保存到内存中,提供一个接口将当前的内存泄露情况报告出去。
//定义一个结构,保存内存分配信息
typedef struct _tagMemoryInfo
{
    void* addr;          //保存分配的内存地址
    size_t size;         //内存大小
    _UL lineNum;      //调用内存分配函数的行号
    char fileName[MAX_FILE_LEN];  //文件名
}MemoryInfo;
//内存分配信息的链表结构,这里之所以定义为union类型,是为了省去next成员的开销
union FreeList
{
    FreeList* next;
    MemoryInfo data;
};
typedef struct _tagBusyList
{
    _tagBusyList* next;
    MemoryInfo* data;
}BusyList;
//空暇链表的初始长度
#define FREE_LIST_INIT_LEN 16
//空暇链表的头指针
static FreeList* g_freeList = NULL;
//正在使用链表的头指针
static BusyList* g_busyList = NULL;
//内部使用函数的声明
static void _CreateFreeList(int initLen);
static void _ReleaseFreeList();
static void* _GetFreeNode();
static void* _GetBusyNode();
static void _FreeNode(void* p);
static void _WriteMemoryInfo(const MemoryInfo* pInfo , bool bAlloc);
static void _StoreMemoryAllocInfo(void* addr , size_t size , _UL lineNum , const char* file);
static void _StoreMemoryDeallocInfo(void* addr);
void* __cdecl operator new(unsigned int size , _UL lineNum , const char* file)
{
    void* p = ::operator new(size);
    _StoreMemoryAllocInfo(p , size , lineNum , file);
    return p;
    //return 0;
}
void __cdecl operator delete(void* p)
{
 _StoreMemoryDeallocInfo(p);
}
void __cdecl operator delete(void *p,  _UL lineNum , const char* file)
{
    lineNum;
 file;
    _StoreMemoryDeallocInfo(p);
}
void* __cdecl operator new[](unsigned int size , _UL lineNum , const char* file)
{
    void* p = ::operator new(size);
   
    _StoreMemoryAllocInfo(p , size , lineNum , file);
   
    return p;   
}
void __cdecl operator delete [] (void *p)
{
    _StoreMemoryDeallocInfo(p);
}
void __cdecl operator delete [] (void *p ,  _UL lineNum , const char* file)
{
 lineNum;
 file;
 _StoreMemoryDeallocInfo(p);
}
void* __cdecl _DebugMalloc(size_t size , _UL lineNum , const char* file)
{
    void* p = malloc(size);
 _StoreMemoryAllocInfo(p , size , lineNum , file);
 return p;
}
void* __cdecl _DebugCalloc(size_t num , size_t size , _UL lineNum , const char* file)
{
 void* p = calloc(num , size);
 _StoreMemoryAllocInfo(p , num * size , lineNum , file);
 return p;
}
void  __cdecl _DebugFree(void* addr)

 _StoreMemoryDeallocInfo(addr); 
}
//创建一个空暇节点链表,生成一个内存池,用以记录内存分配信息。
//这样当频繁分配内存的时候,不会由于检?工具本身的性能,影响应用程序的性能。
void _CreateFreeList(int initLen)
{
    FreeList* p = (FreeList*)malloc(sizeof(FreeList) * initLen);
    g_freeList = p;
    for (int idx = 1; idx < initLen; ++idx)
    {
        p->next = p + idx;
        p++;
    }
    p->next = NULL;
}
void* _GetFreeNode()
{
    if ( g_freeList == NULL)
    {
        _CreateFreeList(FREE_LIST_INIT_LEN);
        if ( NULL == g_freeList )
        {
            return NULL;
        }
    }
   
    FreeList* p = g_freeList;   
    g_freeList = g_freeList->next;
    return (void*)p;
}