我很困惑,并以以下方式思考自由指针,有人能澄清吗
我一直认为free函数只是删除了指针中存储的地址,从而断开了指针和为块分配的空间之间的连接。最后,使空间中的值成为垃圾值,从而使它几乎可以由另一个程序自由使用。
请说明我错的原因。
此外,当你将两个指针指向一个分配的空间时会发生什么并试图释放他们两个?它是否会产生编译错误/运行时错误?
free(ptr)
取消分配其参数ptr
指向的内存块,即将块返回到空闲池。对malloc()
的连续调用可能会使用该内存,并将其重新分配给其他用途。
但是,free()
将其参数接收为副本,也就是说,它从ptr
变量中获取值,而不是从变量本身中获取值。因此,它无法"清除指针"。如果您期望ptr
变量变为NULL
,那么您错了。这是一个常见的错误。您应该在free()
之后自己分配ptr = NULL
,以确保变量值变得不可用。
至于内存块本身:free()
没有义务"使其成为垃圾"或清除它。你可以尝试用同一指针访问释放的内存,通常你会看到以前的内容仍然存在
但是不要依赖它内存几乎随时都可以重新分配给其他用途(释放的内存甚至可能对进程不可用),因此篡改它可能会导致不可预测的结果(即所谓的未定义行为)。
尝试两次解除分配块(即具有相同指针的第二个free()
)也是UB。