版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Word如何监测内存泄漏
如何监测内存泄漏
版权申明
本文可以被自由转载,但是必须遵循如下版权约定:
1、保留本约定,并保留在文章的开头部分。
2、不能任意修改文章内容,或者删节,增加。如果认为本文内容有不当之处需要修改,请与联系。
3、不能摘抄本文的内容,必须全文发表或者引用。
4、必须保留署名、注明文章出处。(本文授权给)
5、如不遵守本规定,则无权转载本文。
ariesram
电子邮件地址
ariesram@,或ariesram@may10.ca
本文及本人所有文章均收集在bambi.may10.ca/~ariesram/articles/中。
本文授权给。
正文:
我曾经参与过一个比较大的项目,在这个项目里面,我们没有一个完全确定的设计文档,所以程序的实现常常变动。虽然我们有一个比较灵活的框架,但是从程序的角度来讲,它使我们的程序非常的混乱。直到发布的日期临近,我们还没有一个稳定的可以用来做alpha测试的版本。所以我们必须尽快的删除掉无用的代码,让这个版本足够的稳定。但是,在这个没有足够规范的软件公司,我们没有时间也没有足够的精力来做边界测试之类的工作。所以我们只能采用变通的办法。在软件中最大的问题就是内存泄漏。因为往往出现这样的情况,我们在一段代码中分配了内存,但是却没有释放它。这造成了很大的问题。我们需要一个简单的解决方案,能够简单的编译进这个项目,在运行的时候,它能够产生一个没有被释放的内存的列表,用这个列表,我们能够改正程序的错误。这就是我们称之为内存跟踪的方法。首先,我们需要一种代码,能够被加入到源代码中去,而且这种代码能够被重用。代码重用是一种很重要的特性,能够节省大量的时间和金钱以及程序员的劳动。另外,我们的这种代码必须简单,因为我们当时已经没有那么多的时间和精力去完全重看一遍所有的代码来重新编写以及改正错误从而使内存跟踪能够起作用。
好在,我们总能够找到解决的办法。首先,我们检查了代码,发现所有的代码都是用new来分配内存,用delete来释放内存。那么,我们能够用一个全程替换,来替换掉所有的new和delete操作符吗?不能。因为代码的规模太大了,那样做除了浪费时间没有别的任何好处。好在我们的源代码是用C++来写成的,所以,这意味着没有必要替换掉所有的new和delete,而只用重载这两个操作符。对了,值用重载这两个操作符,我们就能在分配和释放内存之前做点什么。这是一个绝对的好消息。我们也知道该如何去做。因为,MFC也是这么做的。我们需要做的是:跟踪所有的内存分配和交互引用以及内存释放。我们的源代码使用VisualC++写成,当然这种解决方法也可以很轻松的使用在别的C++代码里面。要做的第一件事情是重载new和delete操作符,它们将会在所有的代码中被使用到。我们在stdafx.h中,加入:
#ifdef_DEBUG
inlinevoid*__cdecloperatornew(unsignedintsize,
constchar*file,intline)
;
inlinevoid__cdecloperatordelete(void*p)
;
#endif
这样,我们就重载了new和delete操作符。我们用ifdef和#endif来包住这两个重载操作符,这样,这两个操作符就不会在发布版本中出现。看一看这段代码,会发现,new操作符有三个参数,它们是,分配的内存大小,出现的文件名,和行号。这对于寻找内存泄漏是必需的和重要的。否则,就会需要很多时间去寻找它们出现的确切地方。加入了这段代码,我们的调用new()的代码仍然是指向只接受一个参数的new操作符,而不是这个接受三个参数的操作符。另外,我们也不想记录所有的new操作符的语句去包含__FILE__和__LINE__参数。我们需要做的是自动的让所有的接受一个参数的new操作符调用接受三个参数的new操作符。这一点可以用一点点小的技巧去做,例如下面的这一段宏定义,
#ifdef_DEBUG
#defineDEBUG_NEWnew(__FILE__,__LINE__)
#else
#defineDEBUG_NEWnew
#endif
#definenewDEBUG_NEW
现在我们所有的接受一个参数的new操作符都成为了接受三个参数的new操作符号,__FILE__和__LINE__被预编译器自动的插入到其中了。然后,就是作实际的跟踪了。我们需要加入一些例程到我们的重载的函数中去,让它们能够完成分配内存和释放内存的工作。这样来做,#ifdef_DEBUG
inlinevoid*__cdecloperatornew(unsignedintsize,
constchar*file,intline)
void*ptr=(void*)malloc(size);
AddTrack((DWORD)ptr,size,file,line);
return(ptr);
;
inlinevoid__cdecloperatordelete(void*p)
RemoveTrack((DWORD)p);
free(p);
;
#endif
另外,还需要用相同的方法来重载new[]和delete[]操作符。这里就省略掉它们了。
最后,我们需要提供一套函数AddTrack()和RemoveTrack()。我用STL来维护存储内存分配记录的连接表。
这两个函数如下:
typedefstruct
DWORDaddress;
DWORDsize;
charfile[64];
DWORDline;
ALLOC_INFO;
typedeflist〈ALLOC_INFO*〉AllocList;
AllocList*allocList;
voidAddTrack(DWORDaddr,DWORDasize,constchar*fname,DWORDlnum)
ALLOC_INFO*info;
if(!allocList)
allocList=new(AllocList);
info=new(ALLOC_INFO);
info-〉address=addr;
strncpy(info-〉file,fname,63);
info-〉line=lnum;
info-〉size=asize;
allocList-〉insert(allocList-〉begin(),info);
;
voidRemoveTrack(DWORDaddr)
AllocList::iteratori;
if(!allocList)
return;
for(i=allocList-〉begin();i!=allocList-〉end();i++)
if((*i)-〉address==addr)
allocList-〉remove((*i));
break;
;
现在,在我们的程序退出之前,allocList存储了没有被释放的内存分配。为了看到它们是什么和在哪里被分配的,我们需要打印出allocList中的数据。我使用了VisualC++中的Output窗口来做这件事情。
voidDumpUnfreed()
AllocList::iteratori;
DWORDtotalSize=0;
charbuf[1024];
if(!allocList)
return;
for(i=allocList-〉begin();i!=allocList-〉end();i++)
sprintf(buf,"%-50s:LINE%d,ADDRESS%d%dunfreed",
(*i)-〉file,(*i)-〉line,(*i)-〉address,(*i)-〉size);
OutputDebugString(buf);
totalSize+=(*i)-〉size;
sprintf(buf,"");
OutputDebugString(buf);
sprintf(buf,"TotalUnfreed:%dbyt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化妆品包装防漏设计建议函(4篇)
- 汽车零部件价格调整请求函3篇
- 2026浙江丽水市文元学校教师招聘2人笔试参考题库及答案详解
- 《泉州市正骨医院2026年工作人员招聘(二)》 B014专技(急诊科医师)笔试参考题库及答案详解
- 2026年黑龙江省佳木斯市政务服务中心(窗口人员)招聘考试备考试题及答案详解
- 新项目合作框架协议商定函(7篇)
- 国家卫生健康委医药卫生科技发展研究中心2026年公开招聘编制外工作人员笔试模拟考试及答案详解
- 2026和顺县百日千万招聘专项行动暨“小而美”就业援助网络招聘活动笔试参考题库及答案详解
- 创意绘画:用画笔点亮想象力小学主题班会课件
- 月度财务报表审阅会议通知4篇
- 潮玩门店运营方案
- 2025年慈善组织自查自纠报告
- 2025中远海运物流所属宁波外代新华国际货运有限公司招聘1人(浙江)笔试历年参考题库附带答案详解
- 阑尾低级别粘液性肿瘤
- 南京医科大学附属第一医院《病理学》期中考试试卷(含答案)
- 雷雨天气安全知识培训课件
- 工业设备维修技术标准手册
- 英语课家长会教学课件
- 下肢静脉曲张护理个案
- 专题03 与圆有关的角和圆内接四边形(题型专练)(原卷版)
- 道路占道施工交通安全承诺书
评论
0/150
提交评论