C++ 指针和free()的关系,看书说free()以后指针指向的内存的值还是原来的值 1C

int p=(int)malloc(sizeof(int));

*p=2;

int *q=p;

printf("%d",*p);

free(p);

printf("%d",*p);
两个值不一样第一个是2,第二个是875986

8个回答

没错,free只是让运行时将这块内存标记为未分配,下次new的时候可能(不是肯定)分配在这个区域内。但是不会改变指针,在free后需要手工加上p=null

楼上讲解的不是很清晰,应该这么理解:
1、free只是释放了malloc所申请的内存,并不改变指针的值;
2、由于指针所指向的内存已经被释放,所以其它代码有机会改写其中的内容,相当于该指针从此指向了自己无法控制的地方,也称为野指针;
3、为了避免失误,最好在free之后,将指针指向NULL。

free只是将指针指向的动态申请的空间释放掉(非动态申请的不行),但指针本身的值并不会改变,你可以直接用p去强制访问它里面存放的值,
(如果那片内存还没有分配给其他数据的话)你就可以看见,和原来的值是一样的。你也可以加断点在free()之前和之后,
然后查看指针的值前后是否一样

理解成房子和门牌号比较容易理解吧,malloc申请了一个int的房子,这个房子有个门牌号,用p记录了下来。
当你把p释放之后,就是把这个int的房子给释放了,这时候,这块内存可能会被别人用了。
但是也可能没被别人用,还在那里,只不过是随时可能被别人用。而p本身的值,还是这个int房子的门牌号,指向它!
你去访问,照样可以访问到,但可能已经不是你要的东西了(可能还没被使用,依然是2,也可能已被使用,是其它值)。
我现在没环境,没测试,有环境的可以多试几次,看看是不是有时候会两次都输出2。

free释放的空间会被回收,里面是随机值,所以不应该访问释放后的地址。

只是 free 后,没有其它代码来操作这块内存的话,它的数据确实是以前的数据、不会改变。包括 free 操作的指针,你自己不将指针赋值为空、它也是以前的数值。
这就是所谓的野指针!因为内存块可能被其它代码使用了。

楼上的理解我认为都有问题!!

malloc的空间你可以理解为一个房子,p指针相当于在这个房子面前查了个小旗。
以后可以根据小旗找到这个房子。

当*p = 2 赋值的时候,相当于房子中放了个2.
当*q=p的时候,相当于把q这个小旗也插在了房子门口。

当free(p)的时候,相当于拔掉这个小旗,将p小旗扔到了一个随意的位置,假设为0x12345678。
此时房子仍然存在,里面的数值仍然为2.、
楼主不信的话,可以打印一下*q的值。

当再次访问*p的时候,此时取的值实际上是0x12345678位置的值。

wasb001
wasb001 真动手试了下,我的理解有问题~
4 年多之前 回复

p是指针,相当于一个住房地址,里边住着房客整数2,然后free(p)是把房客整数2赶出去了,但p这个地址本身没有变,所以你仍然可以访问这间住房。
但p指向的空间被释放后,它指向的空间就是未分配的了,因此是随机值。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!