内存泄露的处理与监测.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内存泄露的处理与监测,如何处理内存泄露,内存泄露怎么处理,内存泄露的原因,内存泄露的原理,内存泄露与溢出区别,检查内存泄露的工具,java内存泄露的原因,内存溢出与内存泄露,java中的内存泄露

内存泄漏的处理与监测 王文陵 (福建信息职业技术学院 福州 350003) 摘要:动态分配、回收内存是C/C++编程语言一个最强的特点,但是最强的同时也可能是最弱的,在内存处理出错的地方通常就是BUGS产生的地方。一个最敏感和难检测的BUG就是内存泄漏——没有把前边分配的内存成功释放,一个小的内存泄漏可能不会引起人的注意,但是程序泄漏大块内存,将可能引起复杂的内存耗尽错误。在此试用三个简单的例子讨论了内存泄漏的产生及防范的方法,并给出使用一些工具有效和系统的监测内存泄漏。 关键词:内存泄漏;动态分配;释放内存 在我们开始接触程序设计时,就会涉及到内存泄漏的问题。特别是一个大型的服务器系统,若存在内存泄漏,更会对系统的长期稳定运行造成致命的硬伤,内存泄漏困扰着应用软件的顺利开发与正常使用。 什么是内存泄漏,内存泄漏的实质是因为在堆上分配了某块内存,在使用完后没有及时释放此内存块以致系统不能对其重新分配,使得该部分内存失去重用性。在编程时导致内存泄漏的情况很多,如没有在程序的全部执行路径中释放内存,没有在析构函数中释放所有的内存等。若此类问题出现在某个应用程序中,当程序结束后内存自动释放,内存泄漏自行消失,若在服务器上发生内存泄漏,则不得不人为的定期中断服务器以避免服务器崩溃,减少不必要的损失。 一、内存泄漏的产生及处理方法 当我们使用C/C++、delphi或java等开发工具编写应用程序时,一般调用malloc或new等函数为指针分配存储空间。其正确使用方法是从堆中分配到一块内存空间,使用完该内存空间后应及时使用free或delete等函数负责释放该块内存空间,以便内存的重新分配与再度使用。若内存没有被释放,并且无合适的指针指向该块内存便于再次使用,这时就可以说内存泄漏了。下面来看几种常见的内存泄漏 1.在多分支的语句中忽略了内存的释放 void MyFt (int n) { char* p= new char[n];//定义一个指针变量并分配一块内存供P使用 if( !GetStringFrom( p, n ) ){ MessageBox(“Error”); return; } …//指针P的正常使用 delete p;//释放P所指向的内存块 } 这是一个C程序段编写的简单内存泄漏示例,当函数GetStringFrom()调用错误时,函数MyFt结束而指针p指向的内存就没有被释放,此时出现了内存泄漏。习惯上在程序段入口处分配内存,在出口处释放内存,但是C函数可以在任何地方退出,所以一旦有某个出口处没有释放应该释放的内存,就很容易发生内存泄漏。这时我们修正程序段,把代码改为 void MyFt (int n) { char* p= new char[nSize]; if( !GetStringFrom( p, n ) ){ MessageBox(“Error”); delete p; //释放P所指向的内存块 return; } …//指针P的正常使用 delete p;//释放P所指向的内存块 } 则可以有效的释放内存避免内存泄漏。 2.释放结构体变量时引起的内部内存泄漏 PDaItem =^TDataItem; TDataItem = Record …… Data: String; end; lstDaItems: TList; pItem: PDaItem; Begin lstDaItems := TList.Create; new(pItem); // 分配了一个结构体的内存 lstDaIetms.Add(pItem); // 存入列表中 … //处理代码 for i := 0 to lstDaItems.Count-1 do Dispose(lstDaItems.Items[i]); //函数结束时释放分配的内存 End; 在这段用delphi编写代码中,内存泄漏发生在语句Dispose(lstDaItems.Items[i]) 上,lstDaItems.Items[i]返回的是一个指针类型的数据,Dispose函数对指针类型数据释放内存时,只会释放该指针所指向的内存块。如上代码所示,指针指向的是一个结构体TDaItem,那么,该结构体本身所占的内存块就被释放了。但是,如果该结构体内部的数据成员如果为String类型、PChar、或对象时,这些数据成员自身所占用的内存会得不到释放,从而引起内存泄漏。显而易见,以上代码至少会引起Data数据成员的内部内存泄漏。 从上例可见,在

文档评论(0)

docinpfd + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5212202040000002

1亿VIP精品文档

相关文档