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