free()'如何知道'传递指针有效吗?

时间:2012-06-12 16:36:33

标签: c pointers free

我知道无效指针会导致未定义的行为,但是free如何知道指针是否有效?

在免费列表中每个块的开头是否有一种校验和? 类似的东西:

if((*ptr) == 'CHECKSUM'))
  free
else
  do something undefined

4 个答案:

答案 0 :(得分:5)

  

我知道无效指针会导致未定义的行为,但是free如何知道指针是否有效?

唯一的检查是指针是否为空。如果它是一个空指针,free(按规范)将不执行任何操作。

否则,free只是试图“释放”内存,假设它是由malloccallocrealloc分配的内存,这可以使任何事情都会发生(通常是坏事) - 因此“未定义的行为。”

答案 1 :(得分:4)

可能有。但总的来说,它没有。对于许多实现,free只是假设它的输入是有效的并且向前犁,好像这是真的。完全有权这样做。

这就是行为“未定义”的原因:如果指针无效,则无法预测会发生什么。在free的操作期间和/或稍后执行某些其他堆操作时,随机区域的内存可能会被删除;可能导致不相关代码中的不可预测行为。该程序可能会在free中立即崩溃,或者稍后会在某些明显不相关的位置崩溃。

答案 2 :(得分:2)

它不知道。它只是假设它是有效的并且行为恰当。

如果这个假设是错误的,那么重要结构的破坏可能已经发生 - 然后发生的事情是未知的。因此未定义的行为。

答案 3 :(得分:1)

由于指针无效,free会尝试读取“簿记信息”,好像指针由malloc返回并且有效,这通常会导致释放一些指向的随机地址指针无效,导致损坏/崩溃等。