内存泄露 检查.pptVIP

  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文档。上传文档
查看更多
内存泄露 检查

(SPG-HA) 查找和清除C程序内存泄漏 2005/01/10 关于内存泄漏 一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,使用完后必须显式释放的内存。应用程序一般使用malloc(),realloc(),calloc()等函数从堆中分配到一块内存,使用完后,程序中通过调用free()释放该内存块,否则这块内存就不能被再次使用,我们就说这块内存泄漏了。 内存泄漏的产生 通过调用malloc()、 calloc() 或realloc()在堆中分配内存块,程序中不再使用,没有释放,就会发生内存泄漏。 库函数或系统调用中分配堆内存,返回给调用者使用,要求调用者通过free()释放。 --比如:最常见的是strdup返回的结果,需要调用者释放。 库函数或系统调用中分配对内存和其他资源,要求调用者使用指定的函数释放内存和相应的资源。 内存泄漏的产生(续) 系统资源没有释放引起的内存泄漏。 广义的说内存泄漏不仅仅包含动态内存的泄漏,还包含系统资源的泄漏,比如:文件描述符,socket等。从根本上说这些系统分配的资源也会消耗内存,这些资源的泄漏也会导致内存的泄漏,且某些系统资源消耗的是核心态内存,这些资源泄漏严重会引起整个系统的运行不稳定。比动态内存泄漏更严重。 程序中产生内存泄漏的常见方式 由于复杂的程序执行流引起的释放遗漏。随着程序规模和复杂性的增加,这种泄漏很难避免。 异常系的内存泄漏。异常系中的内存释放往往容易被忽视。 错误的内存释放引起的泄漏。 --比如: char *pname; pname = (char*)malloc(size); …… pname++; free(pname); 内存泄漏的危害 消耗系统可用内存,降低系统性能。 如果泄漏的内存是操作系统中所有程序共用的全局堆中的核心态内存,而且操作系统本身没有实现任何垃圾回收机制,系统重起之前泄漏的内存就不能再被利用。 发生在代码执行重要区域中的内存泄漏会迅速地消耗掉服务器进程的可用存储空间,使其崩溃或严重影响其性能。 内存泄漏的分类 为了加深对内存泄漏的认识和方便对内存泄漏的查找和排除,这里我们对发生内存泄漏的情形作一个分类,分类的标准是它对程序的危害程度。 (1)只发生一次的内存泄漏 比如在程序入口处分配的内存,这些内存只会分配一次。这种泄漏总会发生,但是不会产生堆积,所以这类泄漏不会对程序造成危害。但是从程序设计的角度,这类泄漏问题能够解决的还是应该解决。特别是某些系统资源,在程序退出后不会自动释放的。不停的运行这种程序还是会造成系统资源的泄漏。 (2)泄漏总会发生,会不断的堆积 这些泄漏总会发生,而且随着程序的运行,这些泄漏会不断堆积。这类泄漏一般发生在程序的主流运行路径上,对程序的危害极大。但因为发生频度高,比较容易找到发生泄漏的代码。 (3)偶尔发生且不断堆积 这类泄漏偶尔会发生,随程序的运行,用户的使用,这些泄漏可能会不断堆积。一般发生在一些不容易执行到的运行路径或异常系。不经常发生,因此不容易被发现,较难排除。 (4)没有及时释放造成的内存 这类泄漏不是由于没有释放内存,而是由于没有及时释放内存造成的。这类泄漏也会堆积,造成系统内存和资源的耗尽。由于程序退出的时候释放了这些内存,理论上说没有内存泄漏。使用工具无法发现,因此是最难发现的。 内存泄漏--最可恶的bug 容易产生,不好查找,当系统比较复杂时不容易修改。 被称为”最可恶的bug”,是我们心中永远的痛。 预防内存泄漏的措施 减小单个函数的代码行数 及时释放动态分配的内存。 CDI时作为Review观点 尽量使用同一系列的内存操作函数进行内存的分配和释放。 解决内存泄漏问题的方法 实现自己的内存管理策略。 在代码中引入一些机制来检查内存泄漏。比如通过”俘获”标准C库的内存操作函数,添加一些处理,记录下内存的分配和使用情况,找出泄漏点。 使用专业的工具。 CDI 内存泄漏工具 值得庆幸的是现在已经很多查找内存泄漏的工具。 --insure++   --Purify --其它MallocDebug、Valgrind、 dmalloc、         Kcachegrind、NuMega 、BoundsCheck 关于内存泄漏工具 原理基本相同,一般采用某种技术在目标代码中加入一些处理,记录和分析内存操作和内存使用情况。对于内存泄漏,会报告泄漏的内存被分配的位置,但是查找内存

文档评论(0)

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

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

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档