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
- 1 回答
- 0 关注
- 98 浏览
添加回答
举报
0/150
提交
取消