首頁  >  文章  >  後端開發  >  刪除指標的映射條目會導致Go記憶體洩漏嗎?

刪除指標的映射條目會導致Go記憶體洩漏嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-24 03:54:30463瀏覽

Does Deleting a Map Entry of Pointers Cause Memory Leaks in Go?

在 Go 中,刪除指標映射中的條目是否會導致記憶體洩漏?

切片或切片時刪除指標切片中的元素可能會導致潛在的記憶體洩漏,讓我們探討一下這是否也適用於映射。


檢查來源

檢查Go運行時來源發現,在mapdelete()函數中,刪除時鍵和值儲存都被清除。

<br>558 func mapdelete(t <em>maptype, h </em>hmap, key unsafe.Pointer) {<pre class="brush:php;toolbar:false">    // ...


600 memclr(k, uintptr(t.keysize))601 v := unsafe.Pointer(uintptr(unsafe.Pointer(b)) dataOffset bucketCntuintptr(t.keysize) i🎜> .valuesize))
602 memclr(v, uintptr(t.valuesize) ))

    // ...

618 }

618 }

這表示鍵或值中的任何指標都會被清除,從而破壞它們的引用到地圖的內部資料結構。

建構一個測試來驗證


為了進一步證明這一點,我們可以建構一個測試:

X, Y int

<p>輸入點結構{</p><p></p>}<p></p>var m = map[int ]*點{}<pre class="brush:php;toolbar:false">fillMap()
delete(m, 1)
runtime.GC()
time.Sleep(time.Second)
fmt.Println(m)

func main() {

}
p := &amp;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)

func fillMap() {

}

}

} ^ 🎜>

運行此測試後,我們觀察到註冊的終結器被調用,確認指針從映射中刪除以及隨後的垃圾回收。

> ;

結論

在 Go 中,從指標對應中刪除條目不會導致記憶體洩漏。鍵和值儲存在刪除時都會被清除,釋放它們持有的任何指針,確保正確的垃圾回收。

以上是刪除指標的映射條目會導致Go記憶體洩漏嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn