首页  >  文章  >  后端开发  >  持有指针时删除映射条目是否会导致内存泄漏?

持有指针时删除映射条目是否会导致内存泄漏?

Patricia Arquette
Patricia Arquette原创
2024-10-24 00:47:02548浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn