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