为什么 free() 放置随机数据块而不是删除节点?

Why does free() put random chunks of data instead of deleting a node?

所以,我正在研究哈希表,我正在用数组实现一个哈希表,冲突解决方法是链接方法。它似乎运行良好,但删除将一些随机数据块放在已删除项目的位置。 我正在使用 free(node) 来删除节点。

我猜你可能写了这样的东西:

free(bucket->node);

该语句释放了 bucket->node 指向的内存,这意味着可以稍后通过调用 malloc 返回内存,也可以将其返回给操作系统。

通常,除非释放的内存非常大(如兆字节),否则出于效率原因,内存不会返回给操作系统。 所以你的程序可能仍然可以通过 bucket->node 指针访问内存,但是在 free returns 之后,内存的内容是未定义的(并且可能已更改为存储使用的管理信息由分配器)。

如果在调用 free(bucket->node) 后引用 bucket->node,则会犯“释放后使用”错误。此错误的影响是不确定的,但可能非常严重。在将 bucket->node 传递给 free.

后,您有责任不取消引用 bucket->node

避免释放后使用的通常方法是立即将指针设置为空。示例:

free(bucket->node);
bucket->node = 0;