首页
社区
课程
招聘
[旧帖] [原创]检测内存泄露(申请邀请码) 0.00雪花
发表于: 2009-8-13 08:00 1392

[旧帖] [原创]检测内存泄露(申请邀请码) 0.00雪花

2009-8-13 08:00
1392
对应用 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直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 164
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
加油, 我也要邀请码!
2009-8-13 09:13
0
雪    币: 83
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
有源码的话,比较malloc/free,new/delete的出现次数是否一致也可以的^_^。
2009-8-13 12:17
0
游客
登录 | 注册 方可回帖
返回
//