为什么要使用'list.Remove()`显式地避免内存泄漏?

为什么要使用'list.Remove()`显式地避免内存泄漏?,list,go,memory-leaks,List,Go,Memory Leaks,container/list.Remove的源代码通过将nil指定给特定变量来显式避免内存泄漏,我们为什么要这样做?谢谢 代码在golang 1.12版的源代码中 //remove从其列表中删除e,递减l.len,并返回e。 函数l*列表删除*元素*元素{ e、 上一个=下一个 e、 next.prev=e.prev e、 next=nil//避免内存泄漏 e、 prev=nil//避免内存泄漏 e、 列表=零 l、 莱恩- 返回e } GC不能处理这种情况吗?从列表中删除的元素在删除后不能指向

container/list.Remove的源代码通过将nil指定给特定变量来显式避免内存泄漏,我们为什么要这样做?谢谢

代码在golang 1.12版的源代码中

//remove从其列表中删除e,递减l.len,并返回e。 函数l*列表删除*元素*元素{ e、 上一个=下一个 e、 next.prev=e.prev e、 next=nil//避免内存泄漏 e、 prev=nil//避免内存泄漏 e、 列表=零 l、 莱恩- 返回e }
GC不能处理这种情况吗?

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

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

e.next = nil
在上面截取的代码中,内存布局如下所示


A -> C > D
     ^
     |
     B
现在,如果元素B仍然在使用,比如说元素B一直使用到程序结束,它有一个指向C的指针。这意味着即使C稍后从列表中删除,并且不再需要C,也不能对C进行垃圾收集

e.prev也可能出现类似情况