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

标签 c hash free

所以,我正在研究哈希表,我正在用数组实现一个哈希表,冲突解决方法是链接法。它似乎运行良好,但删除将一些随机数据 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/

相关文章:

c - 子函数内的 malloc、free 和 memmove

c - 堆栈指针指向保留的内存

c - 这个 C 模式程序有什么问题

c - 二维数组中对角线的总和

c - SNTP 客户端版本 4

javascript - 将 JavaScript 中的大字符串与散列进行比较

检查请求的内存两次

.net - 为什么我的 .net 计算的 MD5 哈希值不等于在网站上计算的哈希值?

algorithm - 布隆过滤器或布谷鸟哈希?

c++ - 删除对象时双重释放或损坏(另一个......)