垃圾收集/链表

top*_*kip 3 garbage-collection go

垃圾收集器(理论上)会收集这样的结构吗?

package main

type node struct {
    next *node
    prev *node
}

func (a *node) append(b *node) {
    a.next = b
    b.prev = a
}

func main() {
    a := new(node)
    b := new(node)
    a.append(b)
    b = nil
    a = nil
}
Run Code Online (Sandbox Code Playgroud)

这应该是一个链表.a指向b,b指回a.当我删除引用ab(最后两行)时,不再可以访问这两个节点.但每个节点仍然有一个参考.请问垃圾收集器会删除这些节点吗?

(显然不是在上面的代码中,而是在更长时间运行的程序中).

是否有关于处理这些问题的垃圾收集器的文档?

zzz*_*zzz 6

程序中的垃圾收集器(GC)集合是{a,b}.将所有这些设置为nil使得所有堆内容都有资格进行收集,因为现在所有现有节点(即使它们引用)都无法从任何根访问.

同样的原理还保证例如具有循环和/或自引用的结构一旦变得不可达就被收集.