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

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不能处理这种情况吗?


当年话下
浏览 77回答 1
1回答

元芳怎么了

从列表中删除的元素在删除后不能指向列表中的其他元素。考虑清单A -> B -> C -> D。B然后从上面的列表中删除该元素。没有声明e.next = nil在上面截取的代码中,内存布局将如下所示。A -> C > D     ^     |     B现在,如果元素 B 仍在使用中(比如元素 B 一直使用到程序结束),它有一个指向 C 的指针。这意味着即使 C 稍后从列表中删除并且不需要,也无法对 C 进行垃圾回收不再。类似的情况可能发生在e.prev
打开App,查看更多内容
随时随地看视频慕课网APP