ホームページ  >  記事  >  バックエンド開発  >  ポインタのマップエントリを削除すると、Go でメモリリークが発生しますか?

ポインタのマップエントリを削除すると、Go でメモリリークが発生しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-24 03:54:30463ブラウズ

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>
<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 := &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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。