绝不能对非动态分配存储块使用free,也不能对同一块内存区同时用free释放两次,为什么?free函数原理是?

如题所述

动态内存也就是堆区,非动态内存也就是栈区

栈是系统管理的,当然不能free

你申请内存时,实际上系统是把一块标记为未使用的内存地址返回给你,然后把那个地址标记为已使用。

你释放的时候,实际上就是把那块内存标记为未使用。

你要对一个已经标记为未使用的内存再标记成未使用,当然就不可以了!
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-02
操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的malloc申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。

free:释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及realloc函数来再分配。
free两次不一定出问题,看人品。最好不要free两次追问

free两次不一定出问题,我也觉得这样!那是教材上说的了,我觉得应该说是“不能对同一块已分配的内存区连续free一次以上”。看来free的原理就像你说的那样,如果那样,那么对同一块已分配的内存区连续free一次以上可能产生的最严重的后会是什么呢?操作系统会终止程序往下运行?还是操作系统会崩溃,然后死机?你觉得呢?

追答

结果未定义,要看内存的实际情况了

第2个回答  2013-04-02
free是释放程序开发人员,开辟的内存。操作系统为程序分配的内存,由操作系统管理,开发者不应处理。

绝不能对非动态分配存储块使用free,也不能对同一块内存区同时用free释...
你释放的时候,实际上就是把那块内存标记为未使用。你要对一个已经标记为未使用的内存再标记成未使用,当然就不可以了!

将一个指针 free 两次之后会发生什么?
总的来说,double free 不仅可能导致内存混乱,更可能成为恶意攻击的入口。因此,开发者在编程时务必谨慎处理内存的分配和释放,以防止此类漏洞的发生。

free函数的用法
3. 多次释放同一块内存或释放未分配的内存会导致不可预测的行为,因此应确保只释放已分配的内存,并且不要重复释放同一块内存。三、使用示例 下面是一个简单的示例,展示了如何使用malloc和free来动态分配和释放内存:c include include int main { int *ptr = malloc); \/\/ 动态分配内存 if { \/\/...

c语言中free函数释放内存后,该内存的里边的数据还有吗?
1.当调用free来释放分配的内存时,它表明该内存可以被其他人使用,也就是说,它可以在其他地方调用malloc之后分配给内存 2.对于释放后内存中的数据数量,我们只能认为是脏数据;换句话说,这部分数据可能存在并保持原始值,也可能被清空或修改为其他值;这表明有许多可能的情况下,因此,内存被释放后,...

C语言 malloc()函数 分配内存空间尺寸的问题
正确使用:分配的空间要能保证容下你想存储的数据,不要和机器逗着玩(分配0空间,或少于自己实际需要的空间),如你上面的操作,表面上你程序运行没有问题,可实际上你占用了别人的地盘,只是当前你很幸运没有使程序出现问题,但不保证一定不出问题!!不再使用的指针,一定要free()来释放空间!malloc...

如果在子函数里申请一块动态存储区,那么在这个子函数结束时这块区域会不...
你如果用mallic申请,那你自己不释放(就是用free释放)那就会直到关机或者注销才会被释放,子函数结束时不会被释放。

C语言中free函数的用法
free 不管指针指向多大的空间,均可以正确地进行释放,这一点释放比 delete\/delete [] 要方便。如在分配指针时,用的是new或new[]。在释放内存时,并不能图方便而使用free来释放。反过来,用malloc 分配的内存,也不能用delete\/delete[]来释放。举例:int* p = (int *) malloc(4);p = 100;fr...

我的电脑浏览完网站后出现这样一个奇怪的提示,请高手帮我!!!
一、应用程序没有检查内存分配失败 程序需要一块内存用以保存数据时,就需要调用操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是“动态内存分配”,内存地址也就是编程中的“指针”。 内存不是永远都招之即来、用之...

为什么“如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运 ...
只能用free(p);释放一次,然后p就变成了所谓“悬浮指针”,就是说它指向的空间已经不存在了,这时若还进行free(p);操作,也将产生运行时错误,就是说已经没有空间可释放了,代码运行时出错了!所以一般主张free(p);操作成功后应立马写一句p=NULL;以规避这种错误。

C语言问题
现在的编译器,在free释放内存后,断开了代码对那段内在空间的控制权,告诉系统那块内存可以重新分配了,但并不切断指针p对那块内存的指向,通过*p仍能读出来正确的值来(在那块内存被再分配前读)——这大概也是一些大家要求free后要给被free的指针赋NULL的原因。一个指针变量有三种状态:一是正常状态,...

相似回答