2017-07-26 10 views
-1

私は値を取得し、私の質問は、それはメモリがゴミになるで後で値または参照によって返されるgolangマップ値?

en := m["foo"] 
delete(m, "foo") 

エントリを削除

type Entity struct{} 
entity := &Entity{} 
m := map[string]*Entity{"foo":entity} 

構造体に、私はポインタの文字列と値のキーでマップを持ってみましょうそれへのポインタがマップから削除されてから収集されますか?他のノートでは、私は新しいポインタをen私はエントリを削除する前に、ポインタのコピーも同じメモリ位置を指しているので、メモリはガベージコレクションされていないマップエントリが削除されますか?私は混乱して、助けに感謝します。

+0

@iczaのおかげで別の投稿を指しているので、すでに回答があります。 –

+0

このコードスニペットは、別のポインタを使用してアドレスを格納するとメモリがガベージコレクションされないことを示しています https://play.golang.org/p/YC4ax6k6dm –

答えて

0

現在の実装はparallel mark-and-sweepガーベジコレクタです。

entityが宣言されている範囲で正確に言えば、あなたが述べたのと同じ理由で、このオブジェクトは収集されずにガレージされません。マップから削除した後でもオブジェクトへの参照が残っています。

マップの状態は内部であり、削除操作後にのみそこから削除されます。