簡介:
在最近的討論中,有人提出刪除Map中的元素指標切片可能會導致記憶體洩漏。這個問題將該查詢擴展到地圖,特別是從持有指標的地圖中刪除條目是否會導致類似的行為。
檢查實作:
要確定此宣告的真實性,讓我們研究一下Go運行時中map刪除的原始碼:runtime/hashmap.go(函數mapdelete() )。檢查發現,刪除時鍵和值都會被清除(#600、#602)。
歸零意義:
清除這些值會有效地切斷地圖和尖銳的物體。這確保即使值本身可能是指針,映射也不再引用它們。因此,如果指向的物件沒有其他引用,則它們就有資格進行垃圾回收。
實際範例:
為了驗證此行為,讓我們建立一個測試案例:
<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[]
在此範例中,指標值(p) 被放入映射中,並且終結器被設定為在垃圾收集時呼叫。從映射中刪除條目並強制進行垃圾回收後,將呼叫終結器,證明指標確實已從映射中刪除。
結論:
以上是持有指標時刪除映射條目是否會導致記憶體洩漏?的詳細內容。更多資訊請關注PHP中文網其他相關文章!