看到我的《评c/c++实战之内存管理》(http://www.csdn.net/develop/read_article.asp?id=11385)有8xx点的人气,感到非常的欣慰。应网友的要求,现将源代码贴上如下
这些代码实现了以下功能:
1。内存分配、记录和释放。
2。内存分配位置,包括文件名,行号记录。
3。内存泄漏检测并指出导致泄漏的代码位置,通过指出文件名,行号和分配次数(用vc的条件断点功能然后跟踪出去,就能查找到导致泄漏的代码)。
4。指针错误使用检测。包括指针丢失,内存越界。
5。内存使用情况。
希望大家多多对我支持,我在受到更多的鼓励的情况下,我将更多的发表些我自己的心得和搜刮来的好的文档,以便于大家共同进步。
欢迎来信指导:lanzhengpeng@263.net
ldebug.h
#ifndef __ldebug_h_1b29cdeb_0e25_4827_a4cc_682a48197ba6
#define __ldebug_h_1b29cdeb_0e25_4827_a4cc_682a48197ba6
#pragma once
#ifndef assert
#include <assert.h>
#define assert assert
#endif
//安全删除指针
#ifndef safe_delete
#define safe_delete(p) {if((p)!=null)delete (p),(p)=null;}
#endif
#if _debug
#pragma warning(disable : 4006 )
#if defined(new) && defined(lnew)
#undef new
#endif
void * llib_debugnew(size_t nsize,const char * pfilename,int dwline);
void llib_debugdelete(void * pmem,const char * pfilename,int dwline);
inline void * _cdecl operator new (size_t nsize,const char * pfilename,int dwline)
{
return llib_debugnew(nsize,pfilename,dwline);
}
inline void * _cdecl operator new (size_t nsize)
{
return llib_debugnew(nsize,0,0);
}
inline void _cdecl operator delete (void * pmem,const char * pfilename,int dwline)
{
llib_debugdelete(pmem,pfilename,dwline);
}
inline void _cdecl operator delete (void * pmem)
{
llib_debugdelete(pmem,0,0);
}
#ifdef lnew
#define new lnew
#else
#define lnew new(__file__,__line__)
#endif
#endif //_debug
#endif //__ldebug_h_1b29cdeb_0e25_4827_a4cc_682a48197ba6
ldebug.cpp
#include "stdafx.h"
#include "ldebug.h"
#include <malloc.h>
#if _debug
struct llib_mem_link
{
dword dwcc1;//效验码
struct llib_mem_link * pnext;//使分配的内存形成一个双向链表
struct llib_mem_link * plast;
dword dwlength;//分配的内存长度,用于后面效验内存越界和信息统计
const char * pname;//分配内存的文件名
dword dwline;//分配内存的行号
dword id;//分配内存的次数
dword dwcc2;//效验码
};
struct llib_mem_link g_llib_mem_head = {0xcdcdcdcd,null,null,0,null,0,0xcdcdcdcd};
struct llib_mem_link * g_llib_mem_current = null;
static int dwllibmemobj = 0;
static int dwllibmemused = 0;
static int dwllibmemmax = 0;
static int llib_outputmemused()
{
char buff[1024];
if(dwllibmemobj>0) {
llib_mem_link * p;
::sprintf(buff,"内存泄露: 有 %d 快内存导致 %d 字节内存没有释放\n最大内存使用: %d 字节( %d k)\n",
dwllibmemobj,dwllibmemused,dwllibmemmax,dwllibmemmax/1024);
outputdebugstring(buff);
for(p=g_llib_mem_head.pnext;p;p=p->pnext) {
if(p->pname==null) {
::sprintf(buff,"未知位置的内存泄露: %u 字节(0x%08x)。第 %d 次分配!\n",p->dwlength,(char *)((unsigned int)p + sizeof(llib_mem_link)),p->id);
}
else {
::sprintf(buff,"%s(%d) : 存在 %u 字节的内存泄露。第 %d 次分配!\n",p->pname,p->dwline,p->dwlength,p->id);
}
outputdebugstring(buff);
}
}
else {
::sprintf(buff,"最大内存使用: %d 字节( %d k)\n",dwllibmemmax,dwllibmemmax/1024);
outputdebugstring(buff);
}
return 0;
}
fdib_api void * llib_debugnew(size_t nsize,const char * pfilename,int dwline)
{
static int dwid = 0;
struct llib_mem_link * temp;
if(g_llib_mem_current == null)
{
_onexit(llib_outputmemused);
g_llib_mem_current = &g_llib_mem_head;
}
dwllibmemused += nsize;
if(dwllibmemmax < dwllibmemused) dwllibmemmax = dwllibmemused;
temp = (llib_mem_link *)malloc(nsize + sizeof(llib_mem_link) + sizeof(dword) * 2);
if(temp != null)
{
g_llib_mem_current->pnext = temp;
temp->dwcc1 = temp->dwcc2 = 0xcdcdcdcd;
temp->dwlength = nsize;
temp->dwline = dwline;
temp->plast = g_llib_mem_current;
temp->pnext = null;
temp->pname = pfilename;
temp->id = dwid;