为什么要使用'list.Remove()`显式地避免内存泄漏?
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 }为什么要使用'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不能处理这种情况吗?从列表中删除的元素在删除后不能指向
GC不能处理这种情况吗?从列表中删除的元素在删除后不能指向列表中的其他元素 考虑列表A->B->C->D。然后从上面的列表中删除元素B。没有声明
e.next = nil
在上面截取的代码中,内存布局如下所示
A -> C > D
^
|
B
现在,如果元素B仍然在使用,比如说元素B一直使用到程序结束,它有一个指向C的指针。这意味着即使C稍后从列表中删除,并且不再需要C,也不能对C进行垃圾收集
e.prev也可能出现类似情况