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

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

Patricia Arquette
發布: 2024-10-24 05:23:30
原創
665 人瀏覽過

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

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板