我正在学习 Go,作为一个练习,我想实现一个链表。为了参考,我查看了官方 Go 代码 (https://golang.org/src/container/list/list.go)。有一点让我印象深刻的是这些行:
108 // remove removes e from its list, decrements l.len, and returns e.
109 func (l *List) remove(e *Element) *Element {
110 e.prev.next = e.next
111 e.next.prev = e.prev
112 e.next = nil // avoid memory leaks
113 e.prev = nil // avoid memory leaks
114 e.list = nil
115 l.len--
116 return e
117 }
我很好奇在这种情况下将指针设置为nil如何防止内存泄漏?如果可能的话,我想构建一个有这个缺陷的程序,并使用pprof进行分析(我将使用未设置此nil指针的list.go的修改版本)。
为了回答更清晰:如果其中一个节点有一个外部指针指向它,则所有相邻的被移除的节点都将通过该指针具有活动引用,并且不会被删除。
- 我们创建一个指向Node2的外部指针
- 我们从列表中移除节点2-4
- 此时您只期望Node 1、2和5仍然存在,并且其余部分被垃圾回收。但是,由于Node2仍然指向Node3等等,整个链仍然未被回收。