問題:
ドキュメントではポインタのスライスを操作する際の注意が推奨されているにもかかわらず、ポインターのマップにも同様の予防措置が必要かどうかは不明です。具体的には、削除する前にエントリを nil に設定するか、マップ全体をクリアする必要がありますか?ガベージ コレクターはメモリの割り当て解除を適切に処理しますか?
調査:
Go ランタイム ソース コード (runtime/hashmap.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>
出力:
Put in map: 0x1040a128 &{X:1 Y:2} Finalized: 0x1040a128 &{X:1 Y:2} map[]
この例では、構造体へのポインターを使用し、ポインターが到達不能になったときを検出するファイナライザーを登録し、対応するマップ エントリを削除します。他にポインターへの参照がないにもかかわらず、そのファイナライザーはガベージ コレクション時に呼び出され、マップからの削除を示します。
結論:
ソース コード検査とテスト例では、Go では削除前にエントリやマップ全体をクリアする必要はありません。ガベージ コレクターは、マップにポインターが含まれている場合でも、メモリの割り当て解除を適切に処理します。
以上がGo のポインタのマップにはメモリ リークに対する特別な処理が必要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。