前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[编程经验]C语言free释放内存后为什么指针里的值不变?竟然还可以输出?

[编程经验]C语言free释放内存后为什么指针里的值不变?竟然还可以输出?

作者头像
编程范 源代码公司
发布2018-04-18 11:36:45
2.3K0
发布2018-04-18 11:36:45
举报

今天你家范儿给大家带来一个的东西——关于C语言为什么释放指针后,指向这块内存的指针的值不变问题的编程经验!!行了,咱们话不多少,直接上主食。

诸位,可得细看呦~

想必大家都知道C语言中动态开辟内存之后,必须要释放内存,来防止内存泄露。也就是malloc之后,必须要free。正所谓”有借有还,再借不难”, 不少同学会问为什么释放指针后,指向这块内存的指针的值不变呢,我们今天为大家揭秘。

首先,我们用malloc开辟一个内存,用strcpy拷贝一串字符串,然后释放掉,通过断点调试进行观察!

下图可以看到,在VC6编译环境下,观察指针p的指针所指向的内容已经被strcpy后改变。

下一步free函数,我们选择F11单步介入观察,幸运的是在VC6中可以看到源代码,如下图,会进入到DBGHEAP.c文件中,会调用_free_dbg函数,继续F11介入观察代码

多次单步之后,我们可以看到一个memset函数,那么F10执行这memset,观察P指向的内容,果然不出我们所料:

0x00970e38处的内容已经被0xDD覆盖,如下图红色字部分。

这里重点观察了,这个memset函数我们应该很熟悉,第二个参数即为要重置的内容,这里我们可以转到定义 处,或者搜索第二个参数_bDeadLandFill,可以看到有如下定义, 为0xDD

怎么样,大家看到这里应该明白了吧!

我们这里是VC6编译器下的环境,也有部分同学反映free之后内容并未消失,这里我们分析可能是部分编译器free函数实现原理不同,欢迎大家自行尝试,并与我们交流。

而关于free之后,p的之后为何没有改变,仍然还是这个原先堆空间的这个地址,原因在于free函数仅仅是将malloc申请的内存释放回去,所谓的释放也就是告诉编译器,这块内存已经使用完毕,可以收回了。但指针所指向的内存值,并不会发生改变。就可以比方说,你租了一套房子,到期后,房子收回归还房东,而此时你可能还拿着房子的钥匙,这个时候你虽然可以继续访问这个房子(内存),但已经不属于你,是非法的。也可能有新的租客入驻更改房子的内置,也可能还是这个样子。取决于不同的房东(编译器)和租客(内容)。

这就是free释放内存后,指针内地址仍然存在,但有时还可以访问,有时候访问输出乱码或输出其他值的原因。

怎么样,大家明白了吗?我觉得是蛮有意思的,大家呢?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程范 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档