当结构体无外部引用但含全局对象指针时,会被垃圾回收吗?
结构体A的垃圾回收问题解答
代码示例
type B struct { // fields of B } type A struct { pb *B } var globalB B func newA() *A { a := &A{ pb: &globalB, } return a }
当调用newA()获取A的引用后,若后续不再有任何指向该A结构体实例的引用,这个A实例会被垃圾回收。
原因很直接:Go采用追踪式垃圾回收机制,它会从根对象(比如全局变量、当前栈帧里的变量等)出发,标记所有能被访问到的可达对象。这里的globalB是全局变量,属于根对象,但A实例只是持有指向globalB的指针,globalB并没有反向指向A实例的引用。当没有其他外部引用指向这个A实例时,它就成了不可达对象,满足垃圾回收的触发条件,最终会被GC回收。
内容的提问来源于stack exchange,提问作者cifer
相关产品推荐
相关产品推荐

