首頁 > 後端開發 > Golang > 主體

持有指標時刪除映射條目是否會導致記憶體洩漏?

Patricia Arquette
發布: 2024-10-24 00:47:02
原創
549 人瀏覽過

Does Deleting a Map Entry Lead to Memory Leaks When Holding Pointers?

刪除Map條目會導致記憶體洩漏嗎?

簡介:
在最近的討論中,有人提出刪除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 := &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)
}</code>
登入後複製

輸出:

Put in map: 0x1040a128 &{X:1 Y:2}
Finalized: 0x1040a128 &{X:1 Y:2}
map[]
登入後複製

輸出:

在此範例中,指標值(p) 被放入映射中,並且終結器被設定為在垃圾收集時呼叫。從映射中刪除條目並強制進行垃圾回收後,將呼叫終結器,證明指標確實已從映射中刪除。
結論:

基於原始程式碼透過分析和實際範例,我們可以得出結論,從指標映射中刪除條目不會導致記憶體洩漏。 Go 運行時透過將清除的值清除來確保正確的垃圾回收,從而允許在不存在其他引用時回收指向的物件。

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

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!