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无法处理这种情况吗?
答案 0 :(得分:2)
从列表中删除的元素在删除后不能指向列表中的其他元素。
考虑列表A -> B -> C -> D
。然后从上面的列表中删除元素B
。没有声明
e.next = nil
在上面的代码中,的内存布局将如下所示。
A -> C > D
^
|
B
现在,如果元素B仍在使用(例如,元素B一直使用到程序末尾),它就有一个指向C的指针。这意味着即使将C从列表中删除,也无法对C进行垃圾回收。不再需要。
e.prev
可能会发生类似的情况