为什么 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;
所以,我正在研究哈希表,我正在用数组实现一个哈希表,冲突解决方法是链接方法。它似乎运行良好,但删除将一些随机数据块放在已删除项目的位置。 我正在使用 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;