You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用free后内存未释放?C语言释放指针后仍读原值的疑问

C语言free内存后仍能读取原数据的原因

核心本质:free的作用不是清空内存

调用free(ptr_to_array)仅会将该内存块标记为可被操作系统重新分配,不会主动清除内存中的原有数据。在这块内存未被其他代码复用前,你仍可能读取到原来的数值——但这属于C标准定义的未定义行为,完全是偶然情况,绝对不能依赖。

为什么这是未定义行为?

C语言标准未规定free后内存必须被修改,不同环境的内存管理策略存在差异:

  • 部分操作系统或编译器会在free后立即覆盖内存数据,部分则会保留数据直到内存被重新分配。
  • 后续任何内存分配操作(如malloc、calloc)都可能占用该内存块,覆盖原有数据,此时再读取会得到垃圾值,甚至导致程序崩溃。

正确的处理方式

若想避免误读已释放的内存,可采取两种常见操作:

  • 释放前清空内存:使用memset(ptr_to_array, 0, sizeof(int)*10);将内存填充为指定值(如0),再调用free。
  • 释放后置空指针:执行ptr_to_array = NULL;,后续误操作该指针时会触发空指针错误,便于排查问题。

代码行为验证

你的代码中,free后立即读取内存时,该内存块尚未被其他操作占用,因此原数据得以保留。若在free后插入其他内存分配操作(如再次调用create_int_array()),第二次打印就会看到垃圾值或新数组的数据。

内容的提问来源于stack exchange,提问作者Dany

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:01:38