首页  >  文章  >  后端开发  >  删除指针的映射条目会导致Go内存泄漏吗?

删除指针的映射条目会导致Go内存泄漏吗?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-24 03:54:30463浏览

Does Deleting a Map Entry of Pointers Cause Memory Leaks in Go?

在 Go 中,删除指针映射中的条目是否会导致内存泄漏?

切片或切片时删除指针切片中的元素可能会导致潜在的内存泄漏,让我们探讨一下这是否也适用于映射。


检查源

检查Go运行时源发现,在mapdelete()函数中,删除时键和值存储都被清除。

<br>558 func mapdelete(t <em>maptype, h </em>hmap, key unsafe.Pointer) {</p>
<pre class="brush:php;toolbar:false">    // ...

600 memclr(k, uintptr(t.keysize))
601 v := unsafe.Pointer(uintptr(unsafe.Pointer(b)) dataOffset bucketCntuintptr(t.keysize) iuintptr(t.valuesize))
602 memclr(v, uintptr(t.valuesize) ))

    // ...

618 }

这意味着键或值中的任何指针都会被清零,从而破坏它们的引用到地图的内部数据结构。

构造一个测试来验证

为了进一步证明这一点,我们可以构造一个测试:

<br>输入点结构 {</p>
<pre class="brush:php;toolbar:false">X, Y int

}

var m = map[int ]*点{}

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)

}

运行此测试后,我们观察到注册的终结器被调用,确认指针从映射中删除以及随后的垃圾回收。

结论

在 Go 中,从指针映射中删除条目不会导致内存泄漏。键和值存储在删除时都会被清除,释放它们持有的任何指针,确保正确的垃圾回收。

以上是删除指针的映射条目会导致Go内存泄漏吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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