Linux下C语言程序内存泄漏的研究

Linux下C语言程序内存泄漏的研究

ID:36766350

大小:302.25 KB

页数:5页

时间:2019-05-15

Linux下C语言程序内存泄漏的研究_第1页
Linux下C语言程序内存泄漏的研究_第2页
Linux下C语言程序内存泄漏的研究_第3页
Linux下C语言程序内存泄漏的研究_第4页
Linux下C语言程序内存泄漏的研究_第5页
资源描述:

《Linux下C语言程序内存泄漏的研究》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、第4期2008年8月工矿自动化IndustryandMineAutomationNo.4Aug.2008文章编号:1671—251X(2008)04一0137—03Linux下C语言程序内存泄漏的研究周超,林邓伟(焦作大学计算机系,河南焦作454003)摘要:文章阐述了内存泄漏的概念、分类、危害以及内存泄露的常发场景,并给出了在Linux下使用Valgrind查找内存泄漏的方法。关键词:内存泄漏;堆内存;Linux;Valgrind中图分类号:TP312文献标识码:BO引言对于一个C/C++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。目前已经有许多技术被研究出来以应对这个问题,比如S

2、martPointer、GarbageCollection等。其中SmartPointer技术比较成熟,STL中已经包含支持SmartPointer的class,但是它的应用并不广泛,而且也不能解决所有的问题;GarbageCollection(垃圾回收)在Java中的应用已经比较成熟,但是在C/C++领域的发展并不顺利。现在已经有许多工具能够帮助检验程序中是否存在内存泄漏,找出产生问题的代码。本文介绍了一种在Linux下使用Valgrind查找内存泄漏的方法。l内存泄漏的定义内存泄漏(memoryleak)是指程序在申请获得动态内存块并使用完毕后,没有释放所申请的动态内存就将保存动态内存地

3、址的变量用于其它用途,使得这些动态内存不可能再被程序使用,也无法被操作系统回收。常说的内存泄漏一般是指堆内存的泄漏。堆内存是指程序从堆中动态分配的、任意大小的存储区,其使用完后必须由程序释放。应用程序一般使用malloc、realloc、new等函数从堆中分配到1块内存,使用完后,必须调用free或delete等函数释放该内存块,否则,这块内存就不能被再次使用,即造成内存泄漏。2内存泄漏的分类根据发生的方式,内存泄漏通常分为4类:(1)常发性内存泄漏。造成内存泄漏的代码会被多次执行,每次代码被执行时都会导致1块内存泄漏。(2)偶发性内存泄漏。造成内存泄漏的代码只有在某种特定环境或操作下才会发

4、生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。(3)一次性内存泄漏。造成内存泄漏的代码只会被执行1次,或者由于算法上的缺陷,导致总会有1块仅且只有1块内存发生泄漏。(4)隐式内存泄漏。程序在运行过程中不断地分配内存,但是直到结束的时候才释放内存。确切收稿日期:2008—03—10地说这里并没有发生内存泄漏,因为程序最终释放作者简介:周超(1976一),女,讲师,华东理工大学在读硕士研了所有申请的内存。但是对于一个服务器程序来说究生,现主要从事计算机软件和操作系统方面的研究工作。需要长时间连续不间断运行,有时几个月甚至几

5、年,性,其中服务器工作线程函数的设计是该多线程HTTP服务器应用程序实现的核心内容。对客户端IP地址的判别在现实应用中有较大的参考价值。参考文献:[1]求是科技.Windows网络编程[M].北京:人民邮电出版社,2003.[2]贾振堂.用Vc开发简易web服务器[J].微型机与应用,1999(10):54~56.[3]万江平.用Java开发HTTP服务器[J].计算机应用研究,2000(2):60~62.[4]郑琪,方思行.通用多线程服务器的设计与实现[J].计算机工程与应用,2003(16):146~184.·138工矿自动化2008年8月如果不及时释放内存可能会导致最终耗尽系统的所有内

6、存。所以,这类内存泄漏称为隐式内存泄漏。3内存泄露的危害从用户使用角度来看少量的内存泄漏不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。存在内存泄漏问题的程序除了会占用更多的内存外,还会使程序的性能急剧下降。4内存泄漏的常发场景(1)指针重新被赋值下面通过一个示例来说明重新赋值这个问题:char*memoryArea=(char*)maUoc(10*sizeof(char));ch

7、ar*newArea一(char*)malloc(10*sizeof(char));图1为内存位置赋值示意图。mem叫A一—叫工工[口丁工[口nc、v胁—叫丁工[口Ⅱ工工口图1内存位置赋值示意图如果执行如下所示的语句(指针重新被赋值):memoryArea=newArea;在上面的代码中,将newArea指针赋值给memoryArea指针。结果,memoryArea以前所指向的内存位置变成了孤立的,则无法释放

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。