调用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
相关产品推荐
相关产品推荐

