__FILE__ //所在的文件
__FUNCTION__ //函数功能
__FUNCDNAME__ //函数名
__LINE__ //在第几行
__DATE__ //产生的日期
__TIME__ //产生的时间
#pragma once
#ifndef __MEMORY_CHECK_H__
#define __MEMORY_CHECK_H__
#ifdef _DEBUG
void* operator new(size_t size, const char* filename, const char* funame, int line);
void* operator new[](size_t size, const char* filename, const char* funame, int line);
void operator delete(void* pMem);
void operator delete[](void* pMem);
#ifndef __USE_MEM_CHECK__
#define __USE_MEM_CHECK__
#define new new(__FILE__,__FUNCTION__,__LINE__)
#endif // !__USE_MEM_CHECK__
#endif // _DEBUG
#endif // !__MEMORY_CHECK_H__
#include<map>
#include<iostream>
#include<Windows.h>
#define __USE_MEM_CHECK__
#include"MemoryCheck.h"
typedef struct stMemInfo
{
void* pMem;
size_t size;
int line;
char funcname[256];
char filename[256];
}MEMINFO,*LPMEMINFO;
std::map<void*, LPMEMINFO>g_MemMap;//存储内存分配的信息
typedef std::map<void*, LPMEMINFO>MEMMAP;
typedef MEMMAP::iterator MEMMAPItr;
class CMemMgr
{
public:
static CMemMgr& Instance()
{
static CMemMgr instance;
return instance;
}
void* Push(LPMEMINFO pInfo)
{
g_MemMap[pInfo->pMem] = pInfo;
return pInfo->pMem;
}
void Pop(void* pMem)
{
MEMMAPItr it = g_MemMap.find(pMem);
if (it != g_MemMap.end())
{
free(pMem);
free(it->second);
g_MemMap.erase(it);
}
}
~CMemMgr()
{
if (!g_MemMap.empty())
{
OutputDebugStringA("\n----------------------------------发现内存泄露信息----------------------------------\n\n");
char buf[256] = {};
int count = 0;
for (auto it:g_MemMap)
{
sprintf_s(buf, "【内存泄漏警告 %d 】 文件%s,第%d行的函数%s中泄漏了%d个字节的内存\n",
count++,
it.second->filename,
it.second->line,
it.second->funcname,
it.second->size);
OutputDebugStringA(buf);
free(it.second->pMem);
free(it.second);
}
g_MemMap.clear();
OutputDebugStringA("\n-------------------------------内存泄漏检测结束----------------------------------\n\n");
}
}
private:
CMemMgr() {};
CMemMgr& operator=(const CMemMgr&) = delete;
CMemMgr(const CMemMgr&) = delete;
};
void* operator new(size_t size, const char* filename, const char* funcname, int line)
{
LPMEMINFO pInfo=(LPMEMINFO)malloc(sizeof(MEMINFO));
pInfo->size = size;
pInfo->line = line;
pInfo->pMem = malloc(size);
strcpy_s(pInfo->filename, filename);
strcpy_s(pInfo->funcname, funcname);
return CMemMgr::Instance().Push(pInfo);
}
void* operator new[](size_t size, const char* filename, const char* funcname, int line)
{
return operator new(size, filename, funcname, line);
}
void operator delete(void* pMem)
{
CMemMgr::Instance().Pop(pMem);
}
void operator delete[](void* pMem)
{
operator delete(pMem);
}
#include<iostream>
#include"MemoryCheck.h"
int main()
{
int* p = new int;
int* p2 = new int[5];
system("pause");
return 0;
}
原文:https://www.cnblogs.com/biu-we/p/13360000.html