首页 > 后端开发 > Golang > 正文

删除Map条目会导致Go内存泄漏吗?

Patricia Arquette
发布: 2024-10-24 05:23:30
原创
591 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!