在 Go 中操作資料結構時的一個常見問題是潛在的記憶體洩漏。這個問題的重點是從指標映射中刪除條目是否會導致此類洩漏。
雖然文件沒有明確解決這個問題,但檢查Go 運行時原始碼顯示,當從映射中刪除條目時,鍵和值儲存都會被清除(清零) 。這意味著其中包含的任何指標也會被清除。
// Clear key storage. memclr(k, uintptr(t.keysize)) // Clear value storage. v := unsafe.Pointer(uintptr(unsafe.Pointer(b)) + dataOffset + bucketCnt*uintptr(t.keysize) + i*uintptr(t.valuesize)) memclr(v, uintptr(t.valuesize))
為了證實這一點,我們可以創建一個帶有指針映射的示例程序並註冊一個終結器當指針變得無法訪問時捕獲:
import ( "fmt" "runtime" "sync" "time" ) type point struct { X, Y int } func main() { // Create a map and put a pointer value in it, with a finalizer. m := map[int]*point{} p := &point{1, 2} runtime.SetFinalizer(p, func(p *point) { fmt.Printf("Finalized: %p %+v\n", p, p) }) m[1] = p fmt.Printf("Put in map: %p %+v\n", p, p) // Delete the entry from the map. delete(m, 1) // Force garbage collection. runtime.GC() // Sleep to ensure the finalizer has a chance to run. time.Sleep(time.Second) // Print the map to verify the map itself wasn't garbage collected. fmt.Println(m) }
運行此命令將產生以下輸出:
Put in map: 0x1040a128 &{X:1 Y:2} Finalized: 0x1040a128 &{X:1 Y:2} map[]
如您所見,當指針從映射中刪除時,將調用終結器並且變得無法訪問,證明沒有內存洩漏。
以上是刪除Map條目會導致Go記憶體洩漏嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!