Home >Backend Development >Golang >Do Memory Leaks Occur When Deleting Entries from Maps in Go?
Deleting Map Entries and Memory Leaks in Go
The first note in SliceTricks indeed prompts caution regarding memory leaks when managing slices of pointers. This article delves into whether the same concern applies to maps and provides a comprehensive explanation with code examples.
Do Maps Suffer from Memory Leaks When Deleting Entries?
Contrary to popular belief, deleting entries from a map does not cause memory leaks. The Go standard library's internal implementation of map deletion, found in runtime/hashmap.go, reveals that both the key and value of the deleted entry are zeroed. This effectively severs their references to any pointers they may contain, eliminating the risk of leaks.
Example to Demonstrate Memory Cleanup
We can further validate this behavior through a test program:
<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 := &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>
After inserting a pointer to a struct into the map and deleting the map entry, we force garbage collection. The output reveals that the registered finalization function is called, indicating that the pointer has been successfully removed and is eligible for garbage collection, thus proving the absence of memory leaks.
Clearing vs. Deleting: A Subtle Distinction
While deleting entries removes specific items, clearing the entire map removes all key-value pairs and resets the map's internal data structures. Consequently, clearing a map also releases all references held by the map, making it eligible for garbage collection along with any pointers contained within its entries.
In conclusion, deleting entries from a map in Go does not result in memory leaks. The underlying implementation effectively clears the storage for both the key and value, severing any pointers to external objects. This ensures proper memory management and prevents potential leakages.
The above is the detailed content of Do Memory Leaks Occur When Deleting Entries from Maps in Go?. For more information, please follow other related articles on the PHP Chinese website!