[2一片指针可能会导致内存泄漏。这个问题将查询扩展到地图,特别是从持有的地图中删除条目是否会导致相似的行为。
检查实现:确定此说法的真实性,让我们调查GO的运行时:Runtime/Hashmap.go(function MapDelete())中的映射删除的源代码。检查表明,删除(#600,#602)。
类型点结构{
x,y int
}
var m = map [int]*点{}
func main(){
fillmap()
删除(M,1)
runtime.gc()
time.sleep(时间。第二)
fmt.println(m)
}
func fillmap(){
P:=& point {1,2}
runtime.setFinalizer(P,func(p *point){
fmt.printf(“最终确定:%p%v \ n”,p,p)
}))
m [1] = p
fmt.printf(“放入地图:%p%v \ n”,p,p)
} [2
最终确定:0x1040A128&{x:1 y:2}
在此示例中,映射[] 将指针值(P)放入地图中,并将最终确定器设置为垃圾集合。从地图上删除条目并强迫垃圾收集后,调用了最终器,证明了指针确实从地图中删除了。
基于源代码分析和实际示例,我们可以得出结论,从指针地图中删除条目确实会导致内存泄漏。 GO运行时通过将清除的值归零,可以确保正确的垃圾收集,从而在不存在其他引用时可以回收指向的对象。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3