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

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

Patricia Arquette
Patricia Arquette原創
2024-10-24 05:23:30591瀏覽

Can Deleting a Map Entry Lead to Memory Leaks in Go?

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

在 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中文網其他相關文章!

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