- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2017-4-11
1
第六讲 内存泄漏检测
6.1 内存泄漏简介
6.2 内存泄漏检测方法
2017-4-11
2
6.1 内存泄漏简介
1. 定义
内存泄漏:是指中请的内存空间在使用结束后未被合理释放,从而导致程序执行时发生异常。简单来说,就是指使用内存空间的指针在生命期结束后被销毁,而其指向的内存空间未被释放,或对内存空间的释放方式错误,从而造成的该块内存空间无法被正常使用。
内存空间的生存周期是从被成功申请至该空间被显式释放或者系统运行结束。内存泄露问题会导致系统运行缓慢、系统运行故障等问题。内存泄露问题本身并不复杂,但是由于软件系统的复杂结构致使检测该类问题具有一定的难度。
2017-4-11
3
2.内存泄漏实例
int func(bool t){
char *a=(char *)malloc(sizeof(char)*5);
if(t) free(a);
else *a=a;
return 0;}
代码首先调用malloc()函数申请了一块内存空间;其次用条件语句对t做出判断,若判断条件为真,则释放掉这块内存空间,否则为该块内存空间赋值。其中当判断条件为假时,该段代码在完成赋值操作后,并未释放该块内存空间,而是直接返回该函数,进而发生了内存泄露问题。
3.内存泄漏类别
可以将内存泄漏问题分为以下四种类型:
1)内存空间未释放:分配的空间未被释放,这个是最常见的内存泄漏类型。需要在每个作用域结束时对该问题进行检测,确定本作用域申请的无用内存空间是否已全部释放。
2)释放静态分配的空间:这种情况是指将静态变量的地址赋给了某指针,其后又将该指针指向的内存空间释放。如:int a=6; int *p=a; delete p; 可以把该类错误归结为内存泄漏错误。
对该类问题的检测方法是查看释放指针引用的内存空间的分配类型,若该内存空间的类型为静态分配,则判定此处发生内存泄漏。即若指针对应的meminfo变量的type值为false,判定该处发生内存泄漏问题。
2017-4-11
4
3)释放类型发生错误:动态分配的空间可能是单独的变量或者是一个数组。二者对应的释放方法不同,如果混淆使用就会发生内存泄露问题。如:char *p1=new char; char *p2=new char[5]; 在第一句分配了一个字符元素,第二个语句分配了一个包含五个字符元素的数组,对第二个内存空间的释放方法为:delete []p2; 若错误的使用了delete p2对该空间进行释放,就会发生内存泄漏问题。
该类型问题的检测方法是在遇到释放语句时,查看该指针对应的内存空间属性,若其对应的meminfo变量的size值不为1时,其释放方式必须是delete []形式,否则判定此处发生内存泄漏问题。
2017-4-11
5
2017-4-11
6
4)释放方式发生错误:在C/C++语言中,常用的内存分配方式有两种:malloc和new。其二者申请的内存空间的释放方式也不同,分别对应为free和delete。可以把使用错误的释放方式引起的问题归结为内存泄漏问题,如对new申请的空间调用了free进行释放。
对此类问题的检测是通过检查释放指针引用的内存空间的malloctype属性。判定该块内存的申请方式和释放方式是否配对。若操作不匹配,则判定此处发生内存泄漏。
1.一般检测方法
在遍历控制流图过程中,在遇到内存释放操作时,会检测该操作是否存在上面提到的后三种问题,其检测方法己在上面列出。对第一类内存泄露问题的检测可以分为两步:
第一步是在修改内存空间属性时进行检测,当内存空间的引用次数降为0,即没有指针引用该空间,且空间未被释放时,这块地址空间就发生了泄漏问题。
第二步是在作用域结束时进行一系列的操作,检测存在的内存泄露问题。
下面将根据每个作用域结束时的作用域链表的使用情况给出第一类内存泄漏的检测算法:
2017-4-11
7
6.2 内存泄漏检测方法
作用域结束时检测内存泄漏过程:
1)根据locscope获取当前作用域的结点scopenode;
2)通过scopenode获取当前作用域的指针变量链表varlist和内存空间的链表memlist。
3)遍历varlist链表,若读取的varinfo结点不为空,根据每个指针变量信息varinfo的id域,在memlist中遍历结点的id域,找到两个id值相等的结点。该结点为这个指针变量引用的内存空间的属性信息,将该内存空间的访问次数减1。然后在varlist中读取下一个varinfo结点。如果在当前的memlist中没有找到与该指针对应的内存空间的结点,则逐层在外部作用域链表中查找,并进行相同的操作。重复执行步骤3)。
4)遍历当前作用域的me
文档评论(0)