为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 `list.Remove()` 试图显式避免内存泄漏?

为什么 `list.Remove()` 试图显式避免内存泄漏?

Go
当年话下 2023-06-19 15:34:15
container/list.Remove() 的源代码试图通过将 nil 分配给特定变量来显式避免内存泄漏,我们为什么要这样做?谢谢!代码在1.12版本的golang源码中。// remove removes e from its list, decrements l.len, and returns e.func (l *List) remove(e *Element) *Element {    e.prev.next = e.next    e.next.prev = e.prev    e.next = nil // avoid memory leaks    e.prev = nil // avoid memory leaks    e.list = nil    l.len--    return e}GC不能处理这种情况吗?
查看完整描述

1 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

从列表中删除的元素在删除后不能指向列表中的其他元素。


考虑清单A -> B -> C -> D。B然后从上面的列表中删除该元素。没有声明


e.next = nil

在上面截取的代码中,内存布局将如下所示。



A -> C > D

     ^

     |

     B

现在,如果元素 B 仍在使用中(比如元素 B 一直使用到程序结束),它有一个指向 C 的指针。这意味着即使 C 稍后从列表中删除并且不需要,也无法对 C 进行垃圾回收不再。


类似的情况可能发生在e.prev


查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 75 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信