Go でのマップ エントリとメモリ リークの削除
SliceTricks の最初のメモは、確かにポインタのスライスを管理する際のメモリ リークに関する注意を促しています。この記事では、同じ問題がマップにも当てはまるかどうかを詳しく掘り下げ、コード例を示しながら包括的な説明を提供します。
エントリを削除するとマップはメモリ リークに悩まされますか?
一般に信じられていることに反して、マップからエントリを削除してもメモリ リークは発生しません。 runtime/hashmap.go にある Go 標準ライブラリのマップ削除の内部実装では、削除されたエントリのキーと値の両方がゼロに設定されていることがわかります。これにより、含まれる可能性のあるポインタへの参照が効果的に切断され、リークのリスクが排除されます。
メモリ クリーンアップをデモンストレーションする例
テスト プログラムを通じてこの動作をさらに検証できます。
<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>
構造体へのポインターをマップに挿入し、マップ エントリを削除した後、ガベージ コレクションを強制します。出力では、登録されたファイナライズ関数が呼び出されていることがわかり、ポインターが正常に削除され、ガベージ コレクションの対象となることが示され、メモリ リークがないことが証明されます。
クリアと削除: 微妙区別
エントリを削除すると特定の項目が削除されますが、マップ全体をクリアするとすべてのキーと値のペアが削除され、マップの内部データ構造がリセットされます。したがって、マップをクリアすると、マップに保持されているすべての参照も解放され、エントリ内に含まれるポインタとともにガベージ コレクションの対象になります。
結論として、Go でマップからエントリを削除してもメモリは増加しません。漏れます。基礎となる実装は、キーと値の両方のストレージを効果的にクリアし、外部オブジェクトへのポインターをすべて切断します。これにより、適切なメモリ管理が保証され、潜在的なリークが防止されます。
以上がGo のマップからエントリを削除するとメモリ リークが発生しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。