C语言内存泄漏原因及对策分析

C语言内存泄漏原因及对策分析

ID:44416148

大小:35.50 KB

页数:5页

时间:2019-10-21

C语言内存泄漏原因及对策分析_第1页
C语言内存泄漏原因及对策分析_第2页
C语言内存泄漏原因及对策分析_第3页
C语言内存泄漏原因及对策分析_第4页
C语言内存泄漏原因及对策分析_第5页
资源描述:

《C语言内存泄漏原因及对策分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、C语言中的内存泄漏原因及对策分析引言:在C语言程序设计中,内存泄漏几乎是很难避免的,C程序产生泄漏内存,则运行速度会逐渐变慢,并最终停止运行;如果产生覆盖内存,程序会变得非常脆弱,很容易受到恶意用户的攻击。内存泄漏是一种隐性危害,它们很难被发现,通常不能在相应的源代码中找到错误,需要仔细分析与专门的检测工具才能发现。1、内存泄漏的定义通常我们所说的内存泄漏,是指分配出去的内存在使用之后没有释放掉,没有回收,长此以往,会造成没有足够的内存可以分配。一般表现为运行吋间越长,占用的内存越多,最终导致系统奔溃。一般的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任

2、意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。2、内存泄漏原因分析内存泄漏的原因实质是没有释放向系统审请的内存,要了解内存泄漏产生的原因,我们首先了解c语言内存分配情况。2.1C语言内存分配情况在C语言中,根据数据在内存中存在的时间(生存周期)不同,将内存空间分为三个区:1)程序区:用于存储程序的代码,即程序的一•进制代码。2)静态存储区:用于

3、存储全局变量和静态变量,这些变量的空间在程序编译时就已经分配好了。3)动态存储区:用于在程序执行时分配的内存,又分为:堆区(heap)和栈区(stack)o堆区:用于动态内存分配,程序运行时由内存分配函数在堆上分配内存。在C语言中,只能使用指针才能动态的分配内存。栈区:在函数执行时,函数内部的局部变量和函数参数的存储单元的内存区域,函数运行结束时,这些内存区域会自动释放。2.2C语言动态内存分配在C语言中用内存分配函数來实现内存的动态分配,这些函数有:malloc()和realloc()等函数。malloc():使用这个函数时需要包含头文件<stdlib.h>。使用该

4、函数需要指定要分配的内存字节数作为参数,例如:int*pNumber=(int*)malloc(100)这条语句分配了100个字节的内存,并把这个内存块的地址赋给pNumber,这个内存块口J以保存最大25个int值,每个int占4个字节。如果不能分配请求的内存,malloc()会返回一个null指针。2.3释放动态分配的内存堆上分配的内存会在整个应用程序结朿之后,由操作系统负责回收,但最好是在使用完这些内存后立即释放。如果不释放,会引起内存泄漏,极大占用系统资源,可能会产生各种未知的错误。所以,必须使用free()函数释放内存,参数是内存地址(指针),例如:free

5、(pNumber),依上例。3、内存泄漏避免的方法3.1正确使用malloc函数分配内存malloc是一个函数,专门用来从堆上分配内存。使用malloc函数需要几个要求:内存分配给谁?分配多大内存?是否还有足够内存分配?内存将用来存储什么格式的数据?分配好的内存在哪里?如果这5点都确定,那内存就能分配。下面看看malloc的原型:(void*)malloc(intsize)malloc函数的返回值是一个void类型的指针,参数为int类型的数据,即申请分配的内存大小,单位是字节。内存分配成功之后,malloc函数返回这块内存的首地址,你需要一个指针来接受这个地址。但是

6、由于函数的返回值是void*类型,所以必须强制转换成你所接收的类型。也就是说这块内存将来要用来存储什么类型的数据,如:char*p=(char*)malloc(100)在堆内存分配了100个字节的内存,返回这块内存的首地址,把地址强制转换成char*类型后赋给char*类型的指针变量p;同时告诉我们这块内存将用来存储char类型的数据。你只能通过指针变量p来操作这块内存,这块内存本身没有名字,对它的访问是匿名访问。但是,不一定每次malloc函数都能成功分配到内存,注意这点:如果所申请的内存块大于目前堆上剩余的内存块(整块),则内存分配就会失败,返回NULL。因为ma

7、lloc函数申请的是连续的一块内存。既然malloc函数申请内存存在不成功的可能,那我们在使用指向这块内存的指针时,必须用if(NULL!=p)语句上来验证内存分配确实成功了。3.2正确使用free函数释放内存既然有分配,那就必须有释放,不然的话,有限的内存就会用光,而没有释放的内存却占用空间,与malloc对应的就是free函数了。free函数只有一个参数,就是所要释放的内存块的首地址(指针)。按上例,则为:free(p)free函数其实它就做了一件事:斩断指针变量和这块内存的对应关系。比如上面的例子,我们可以说malloc函数分配的内存块是属于P

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

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

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