3

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

空闲列表中每个块的开头是否有校验和?就像是:

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

4 回答 4

5

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

唯一的检查是指针是否为空。如果它是一个空指针,free(按规范)将什么也不做。

否则,free只是尝试“释放”内存,假设它是由malloccalloc或分配的内存realloc,这可能导致任何事情发生(通常是坏事)——因此是“未定义的行为”。

于 2012-06-12T16:38:00.303 回答
4

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

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

于 2012-06-12T16:41:03.257 回答
2

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

如果这个假设是错误的,那么重要的结构可能已经被破坏了——然后会发生什么,我们不得而知。因此未定义的行为。

于 2012-06-12T16:38:31.963 回答
1

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

于 2012-06-12T16:45:43.020 回答