所以,我正在研究哈希表,我正在用数组实现一个哈希表,冲突解决方法是链接法。它似乎运行良好,但删除将一些随机数据 block 放在已删除项目的位置。 我正在使用 free(node) 来删除节点。
最佳答案
我猜你可能写了这样的东西:
free(bucket->node);
该语句释放了 bucket->node
指向的内存,这意味着内存可以稍后通过调用 malloc
返回,或者可以返回到操作系统。
通常,除非释放的内存非常大(如兆字节),否则出于效率原因,内存不会返回给操作系统。
所以你的程序可能仍然可以通过 bucket->node
指针访问内存,但是在 free
返回后,内存的内容是未定义的(并且可能已被更改存储分配器使用的管理信息)。
如果在调用 free(bucket->node)
之后引用 bucket->node
,就会犯“use-after-free”错误。此错误的影响是不确定的,但可能非常严重。您有责任在将 bucket->node
传递给 free
后取消引用它。
避免释放后使用的通常方法是立即将指针设置为空。示例:
free(bucket->node);
bucket->node = 0;
关于c - 为什么 free() 放置随机数据 block 而不是删除节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53565173/