問題:
儘管文件建議在操作指針切片時要小心,目前尚不清楚指針映射是否需要採取類似的預防措施。具體來說,是應該在刪除之前將條目設為nil,還是清除整個映射?垃圾收集器能否充分處理記憶體釋放?
調查:
檢查Go 運行時原始碼(runtime/hashmap.go) 發現鍵和值儲存都是在映射刪除期間清除,將其中包含的所有指針歸零。
透過範例證明:
以下程式碼示範了沒有記憶體洩漏:
<code class="go">type point struct { X, Y int } var m = map[int]*point{} func main() { fillMap() delete(m, 1) runtime.GC() time.Sleep(time.Second) fmt.Println(m) } func fillMap() { 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) }</code>
輸出:
Put in map: 0x1040a128 &{X:1 Y:2} Finalized: 0x1040a128 &{X:1 Y:2} map[]
輸出:
此範例使用指向結構體的指針,註冊終結器以檢測指針何時變得不可訪問,然後刪除其對應的映射項目。儘管沒有其他對指針的引用,但它的終結器在垃圾回收時被調用,表明它從映射中刪除。 結論:基於原始程式碼檢查和例如測試,在 Go 中不需要在刪除之前清除條目或整個映射。即使映射包含指針,垃圾收集器也會正確處理記憶體釋放。以上是Go 中的指標映射是否需要對記憶體洩漏進行特殊處理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!