[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