free()函数详解

您所在的位置:网站首页 free函数出错 free()函数详解

free()函数详解

2023-03-31 15:12| 来源: 网络整理| 查看: 265

1.结构体free

首先我们知道,在使用struct来定义并声明一个变量时,将会自动划分出一个连续的储存空间(虽然根据某些对齐原则会出现内存间隙,但是大体上来说还是连续的) 这一块连续空间将会包括结构体中的其他变量所需要的内存。就像这样。 这是一个名为X的结构体变量

在这里插入图片描述

而free()函数的作用是对动态分配的内存进行释放,这也就意味着当使用free函数清空一个结构体时,只会清空这个大框里的内存,而不会对a,b,c,d指向的内存进行清理。

当然,一般来说直接定义变量于结构体内会更加方便。 但是考虑一下两种声明

struct stuff{ char home[10]; int num; char name[10]; }; struct stuff{ char *home; int num; char name[10]; };

两者的不同在于,第二种使用的是char指针,所以进行gets(),或者初始化时,*home将会把值储存在常量区。

那么我们考虑一下以下代码 目的是为了查看,在free前后,*home与name的变化

#include #include struct stuff{ char *home; int num; char name[10]; }; int main(void){ struct stuff *TOM=(struct stuff *)malloc(sizeof(struct stuff)); TOM->home="LONDON"; TOM->num=201; strcpy(TOM->name,"TOM"); char *p1=TOM->home; char *p2=TOM->name; printf("home=%s pointer of home%p name=%s\n",TOM->home,TOM->home,TOM->name); free(TOM); printf("home=%s pointer of home%p name=%s\n",p1,p1,p2); return 0 }

运行结果:

home=LONDON pointer of home0000000000404000 name=TOM home=LONDON pointer of home0000000000404000 name=

嗯,我们可以发现home的值仍然保存着,而name的内存被释放。 综上我们可以得出什么结论呢? free()只能释放指针所指向的那片内存。也就是说,如果我们不断地声明第二种类型的结构体的话,即使调用free()也会造成内存的浪费。最明显的应该是体现在链表类结构。 所以如果要进行插入与删除的操作的话还是考虑第一种结构体靠谱。

2.野指针

free函数只是将参数指针指向的内存归还给操作系统,并不会把参数指针置NULL,为了以后访问到被操作系统重新分配后的错误数据,所以在调用free之后,通常需要手动将指针置NULL。从另一个角度来看,内存这种底层资源都是由操作系统来管理的,而不是编译器,编译器只是向操作系统提出申请。所以free函数是没有能力去真正的free内存的。只是告诉操作系统它归还了内存,然后操作系统就可以修改内存分配表,以供下次分配。

free(str)后指针仍然指向原来的堆地址,即你仍然可以继续使用,但很危险,因为操作系统已经认为这块内存可以使用,他会毫不考虑的将他分配给其他程序,于是你下次使用的时候可能就已经被别的程序改掉了,这种情况就叫“野指针”,所以最好free()了以后再置空 str = NULL; 即本程序已经放弃再使用他。 何谓“野指针”,在这里补充一下。

野指针是指程序员或操作者不能控制的指针。野指针不是NULL指针,而是指向“垃圾”的指针。

造成“野指针”的原因主要有

1.指针变量没有初始化,任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。在初始化的时候要么指向合法的指针,要么指向NULL。

2.指针变量被free或delete之后,没有设置为NULL。它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。上文DEMO则是这种情况。

3.指针操作超越了变量的作用范围。 注意其生命周期。

【下面是摘自论坛里面的形象比喻,加深理解。】 CRT的内存管理模块是一个管家。 你的程序(简称“你”)是一个客人。 管家有很对水桶,可以用来装水的。 malloc的意思就是“管家,我要XX个水桶”。 管家首先看一下有没有足够的水桶给你,如果没有,那么告诉你不行。如果够,那么登记这些水桶已经被使用了,然后告诉你“拿去用吧”。 free的意思就是说:“管家我用完了,还你!”。 至于你是不是先把水倒干净才给管家,那么是自己的事情了。--是不是清零。 管家也不会将你归还的水桶倒倒干清(他有那么多水桶,每个归还都倒干净岂不累死了)。反正其他用的时候自己会处理的啦。 free之后将指针清零只是提醒自己,这些水桶已经不是我的了,不要再完里面放水了,_ 如果free了之后还用那个指针的话,就有可能管家已经将这些水桶给了其他人装饮料的了,你却往里面撒了泡尿。好的管家可能会对你的行为表示强烈的不满, 杀了你(非法操作)--这是最好的结果,你知道自己错了(有错就改嘛)。一些不好的管家可能忙不过来,有时候抓到你作坏事就惩罚你,有时候却不知道去那里 了--这是你的恶梦,不知道什么时候、怎么回事情自己就死了。不管怎么样,这种情况下很有可能有人要喝尿--不知道是你的老板还是你的客户了._。 所以啊,好市民当然是还了给管家的东西就不要再占着啦,._。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3