c语言free的用法.docx

上传人:安*** 文档编号:17709353 上传时间:2022-05-26 格式:DOCX 页数:11 大小:18.88KB
返回 下载 相关 举报
c语言free的用法.docx_第1页
第1页 / 共11页
c语言free的用法.docx_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《c语言free的用法.docx》由会员分享,可在线阅读,更多相关《c语言free的用法.docx(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、c语言free的用法c语言free的用法在C语言的学习中,对内存管理这部分的知识把握尤其重要!如今我们来看看c语言free的用法。一、malloc()和free()的基本概念以及基本用法:1、函数原型及讲明:void*malloc(longNumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。假如分配失败,则返回一个空指针(NULL)。关于分配失败的原因,应该有多种,比方讲空间缺乏就是一种。voidfree(void*FirstByte):该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。2、函数的用法:其实这两

2、个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:/Code.char*Ptr=NULL;Ptr=(char*)malloc(100*sizeof(char);if(NULL=Ptr)exit(1);gets(Ptr);/code.free(Ptr);Ptr=NULL;/code.就是这样!当然,详细情况要详细分析以及详细解决。比方讲,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。3、关于函数使用需要注意的一些地方:A、申请了内存空间后,必须检查能否分配成功。B

3、、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。C、这两个函数应该是配对。假如申请后不释放就是内存泄露;假如无故释放那就是什么也没有做。释放只能一次,假如释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。D、固然malloc()函数的类型是(void*),任何类型的指针都能够转换成(void*),但是最好还是在前面进行强迫类型转换,由于这样能够躲过一些编译器的检查。好了!最基础的东西大概这么讲!如今进入第二部分:二、malloc()到底从哪里得来了内存空间:1、mal

4、loc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是讲函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!讲到这里,不得不另外插入一个小话题,相信大家也知道是什么话题了。什么是堆?讲到堆,又忍不住讲到了栈!什么是栈?下面就另外开个小部分专门而又简单地讲一下这个题外话:2、什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始

5、化的时候分配,运行经过中可以以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开场的时候初始化,每个线程的栈相互独立。每个函数都有本人的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。以上的概念描绘是标准的描绘,不过有个别语句被我删除,不知道由于这样而变得不标准了_.通过上面对概念的描绘,能够知道:栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据构造中的栈。堆一般由程序员分配释放,若不

6、释放,程序结束时可能由OS回收。注意这里讲是可能,并非一定。所以我想再强调一次,记得要释放!注意它与数据构造中的堆是两回事,分配方式倒是类似于链表。(这点我上面略微提过)所以,举个例子,假如你在函数上面定义了一个指针变量,然后在这个函数里申请了一块内存让指针指向它。实际上,这个指针的地址是在栈上,但是它所指向的内容却是在堆上面的!这一点要注意!所以,再想想,在一个函数里申请了空间后,比方讲下面这个函数:/code.voidFunction(void)char*p=(char*)malloc(100*sizeof(char);就这个例子,千万不要以为函数返回,函数所在的栈被销毁指针也跟着销毁,申

7、请的内存也就一样跟着销毁了!这绝对是错误的!由于申请的内存在堆上,而函数所在的栈被销毁跟堆完全没有啥关系。所以,还是那句话:记得释放!3、free()到底释放了什么这个问题比拟简单,其实我是想和第二大部分的题目相照应罢了!哈哈!free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只要程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过如今指针指向的内容的垃圾,是未定义的,所以讲是垃圾。因而,前面我已经讲过了,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。非常重要啊这一点!好了!这个题外话终于讲完了。就这么

8、简单讲一次,知道个大概就能够了!下面就进入第三个部分:三、malloc()以及free()的机制:这个部分我今天才有了新的认识!而且是转折性的认识!所以,这部分可能会有更多一些认识上的错误!不对的地方请大家帮助指出!事实上,仔细看一下free()的函数原型,也许也会发现似乎很神奇,free()函数非常简单,只要一个参数,只要把指向申请空间的指针传递给free()中的参数就能够完成释放工作!这里要追踪到malloc()的申请问题了。申请的时候实际上占用的内存要比申请的大。由于超出的空间是用来记录对这块内存的管理信息。先看一下在(UNIX环境高级编程)中第七章的一段话:大多数实现所分配的存储空间比

9、所要求的要稍大一些,额外的空间用来记录管理信息分配块的长度,指向下一个分配块的指针等等。这就意味着假如写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是由于这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移动可以能会改写本块的管理信息。以上这段话已经给了我们一些信息了。malloc()申请的空间实际我觉得就是分了两个不同性质的空间。一个就是用来记录管理信息的空间,另外一个就是可用空间了。而用来记录管理信息的实际上是一个构造体。在C语言中,用构造体来记录同一个对象的不同信息是天经地义的事!下面看看这个构造体的原型:structmem_contro

10、l_blockintis_available;/这是一个标记?intsize;/这是实际空间的大小;对于size,这个是实际空间大小。这里其实我有个疑问,is_available能否是一个标记?由于我看了free()的源代码之后对这个变量感觉有点纳闷(源代码在下面分析)。这里还请大家指出!所以,free()就是根据这个构造体的信息来释放malloc()申请的空间!而构造体的两个成员的大小我想应该是操作系统的事了。但是这里有一个问题,malloc()申请空间后返回一个指针应该是指向第二种空间,也就是可用空间!不然,假如指向管理信息空间的话,写入的内容和构造体的类型有可能不一致,或者会把管理信息屏

11、蔽掉,那就没法释放内存空间了,所以会发生错误!(感觉本人这里讲的是废话)好了!下面看看free()的源代码,我本人分析了一下,觉得比起malloc()的源代码倒是容易简单很多。只是有个疑问,下面指出!/code.voidfree(void*ptr)structmem_control_block*free;free=ptr-sizeof(structmem_control_block);free-is_available=1;return;看一下函数第二句,这句非常重要和关键。其实这句就是把指向可用空间的指针倒回去,让它指向管理信息的那块空间,由于这里是在值上减去了一个构造体的大小!后面那一句f

12、ree-is_available=1;我有点纳闷!我的想法是:这里is_available应该只是一个标记罢了!由于从这个变量的名称上来看,is_available翻译过来就是是能够用。不要讲我土!我觉得变量名字能够反映一个变量的作用,十分是严谨的代码。这是源代码,所以我觉得绝对是严谨的!这个变量的值是1,表明是能够用的空间!只是这里我想了想,假如把它改为0或者是其他值不知道会发生什么事?!但是有一点我能够肯定,就是释放绝对不会那么顺利进行!由于这是一个标记!当然,这里可能还是有人会有疑问,为什么这样就能够释放呢?我刚刚也有这个疑问。后来我想到,释放是操作系统的事,那么就free()这个源代码

13、来看,什么也没有释放,对吧?但是它确实是确定了管理信息的那块内存的内容。所以,free()只是记录了一些信息,然后告诉操作系统那块内存能够去释放,详细怎么告诉操作系统的我不清楚,但我觉得这个已经超出了我这篇文章的讨论范围了。那么,我之前有个错误的认识,就是以为指向那块内存的指针不管移到那块内存中的哪个位置都能够释放那块内存!但是,这是大错特错!释放是不能够释放一部分的!首先这点应该要明白。而且,从free()的源代码看,ptr只能指向可用空间的首地址,不然,减去构造体大小之后一定不是指向管理信息空间的首地址。所以,要确保指针指向可用空间的首地址!不信吗?本人能够写一个程序然后移动指向可用空间的指针,看程序会有会崩!最后可能想到malloc()的源代码看看malloc()到底是怎么分配空间的,这里面涉及到很多其他方面的知识!有兴趣的朋友能够本人去下载源代码去看看。c语言free的用法在C语言的学习中,对内存管理这部分的知识把握尤其重要!如今我们来看看c语言free的用法。一、malloc()和free()的基本概念以及基本用法:1、函数原型及讲明:void*malloc(longNumBytes):该函数分配了NumBytes个字节,并返回了指向推荐度:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 策划方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁