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

时间:2019-05-20 01:39:03

标签: list go memory-leaks

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 个答案:

答案 0 :(得分:2)

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

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

e.next = nil
在上面的代码中,

的内存布局将如下所示。


A -> C > D
     ^
     |
     B

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

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