我知道无效指针会导致未定义的行为,但是free如何知道指针是否有效?
在免费列表中每个块的开头是否有一种校验和? 类似的东西:
if((*ptr) == 'CHECKSUM'))
free
else
do something undefined
答案 0 :(得分:5)
我知道无效指针会导致未定义的行为,但是free如何知道指针是否有效?
唯一的检查是指针是否为空。如果它是一个空指针,free(按规范)将不执行任何操作。
否则,free
只是试图“释放”内存,假设它是由malloc
,calloc
或realloc
分配的内存,这可以使任何事情都会发生(通常是坏事) - 因此“未定义的行为。”
答案 1 :(得分:4)
可能有。但总的来说,它没有。对于许多实现,free
只是假设它的输入是有效的并且向前犁,好像这是真的。完全有权这样做。
这就是行为“未定义”的原因:如果指针无效,则无法预测会发生什么。在free
的操作期间和/或稍后执行某些其他堆操作时,随机区域的内存可能会被删除;可能导致不相关代码中的不可预测行为。该程序可能会在free
中立即崩溃,或者稍后会在某些明显不相关的位置崩溃。
答案 2 :(得分:2)
它不知道。它只是假设它是有效的并且行为恰当。
如果这个假设是错误的,那么重要结构的破坏可能已经发生 - 然后发生的事情是未知的。因此未定义的行为。
答案 3 :(得分:1)
由于指针无效,free
会尝试读取“簿记信息”,好像指针由malloc
返回并且有效,这通常会导致释放一些指向的随机地址指针无效,导致损坏/崩溃等。