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

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

Mary-Kate Olsen
发布: 2024-10-24 03:54:30
原创
544 人浏览过

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>
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><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>
<div class="code" style="position:relative; padding:0px; margin:0px;"><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中文网其他相关文章!

来源:php
上一篇:如何解决Go中Currency.Symbol的货币格式问题? 下一篇:如何克服使用反射设置结构体字段值时 SetCan() 始终返回 False 的问题?
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
关于CSS思维导图的课件在哪? 课件
来自于 2024-04-16 10:10:18
0
0
1781
相关专题
更多>
热门推荐
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板