スライス中またはポインタのスライス内の要素を削除すると、潜在的なメモリ リークが発生する可能性があります。これがマップにも当てはまるかどうかを調べてみましょう。
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)) dataOffsetbucketCntuintptr(t.keysize) iuintptr(t.valuesize))
602 memclr(v, uintptr(t.valuesize) ))
// ...
618 }
これは、キーまたは値のポインターがゼロになり、それらの参照が壊れることを意味します
これをさらに実証するには、 test:
<br>type point struct {</p> <pre class="brush:php;toolbar:false">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)
}
このテストを実行すると、登録されたファイナライザーが呼び出され、マップからのポインターの削除とその後のガベージ コレクションが確認されることがわかります。
Go では、ポインタのマップからエントリを削除してもメモリ リークは発生しません。キーと値のストレージは両方とも削除時にクリアされ、保持されていたポインタが解放され、適切なガベージ コレクションが保証されます。
以上がポインタのマップエントリを削除すると、Go でメモリリークが発生しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。