对应用 malloc free 或者new delete操作的内存可以通过重定义 malloc free 或new delete来进行内存泄露的检查,具体代码如下:
////////////////////////////////mem.h///////////////////////////////////////
#ifndef _MEM_H_
#define _MEM_H_
#pragma once
#include <map>
#include <utility>
using namespace std;
#pragma warning(disable:4291)
#define DIM(A) sizeof(A)/sizeof(A[0])
#ifdef _DEBUG
typedef struct tag_MemoryInfo
{
char tszFile[MAX_PATH];
ULONG cchLine;
size_t nMemSize;
}MemoryInfo;
extern map<DWORD,MemoryInfo> g_MemList;
void* __cdecl operator new(size_t nSize,LPCSTR lpszFileName,int nLine);
void __cdecl operator delete(void *pvMem);
#if 0
void* __cdecl operator new[](size_t nSize, LPCSTR lpszFileName, int nLine);
void __cdecl operator delete[](void* p, LPCSTR lpszFileName, int nLine);
void __cdecl operator delete[](void *);
#endif
#define DEBUG_NEW new(__FILE__, __LINE__)
#define DEBUG_DELETE delete(__FILE__, __LINE__)
#endif
#endif // _MEM_H_
////////////////////////////////mem.cpp///////////////////////////////////////
#include "stdafx.h"
#include "mem.h"
#ifdef _DEBUG
map<DWORD,MemoryInfo> g_MemList;
void* __cdecl operator new(size_t nSize,LPCSTR lpszFileName,int nLine)
{
PVOID pVoid = ::operator new(nSize);
MemoryInfo mem;
mem.cchLine = nLine;
mem.nMemSize = nSize;
strcpy_s(mem.tszFile,DIM(mem.tszFile),lpszFileName);
g_MemList[(DWORD)pVoid] = mem;
return pVoid;
}
void __cdecl operator delete(void* p)
{
DWORD nKeyword = (DWORD)p;
if (!g_MemList.empty())
{
map<DWORD,MemoryInfo>::iterator iter= g_MemList.find(nKeyword);
if (iter != g_MemList.end())
{
g_MemList.erase(iter);
}
}
::free(p);
}
#endif
在程序退出时候,检测g_memList链表是否为空,对于不为空的,可以通过文件名以及对应代码行号进行查找,从而避免内存泄露。
对应GDI对象引起的内存泄露,暂时还没有很好的方法,目前研究中。。。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课