切片或切片时删除指针切片中的元素可能会导致潜在的内存泄漏,让我们探讨一下这是否也适用于映射。
检查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 := &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中文网其他相关文章!