我正在学习围棋,作为练习,我想实现一个链表.作为参考,我查看了官方围棋代码(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进行分析时看到它(我将使用修改后的list.go版本,而不使用此nil指针设置).
For clarity of answer:如果其中一个 node 有一个指向它的外部指针,那么所有相邻的已删除 node 都将有一个通过该指针的活动引用,并且不会被删除.
- 我们创建一个指向Node2的外部指针
- 我们从列表中删除 node 2-4
- 此时,您只希望 node 1、2和;