「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > マップエントリを削除すると、ポインターを保持するときにメモリリークが発生しますか?

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

2025-02-06に投稿しました
ブラウズ:611

Does Deleting a Map Entry Lead to Memory Leaks When Holding Pointers?

マップエントリを削除するとメモリリークが漏れますか?ポインターのスライスは、潜在的にメモリリークにつながる可能性があります。この質問は、その問い合わせをマップに拡張します。特に、ポインターを保持しているマップからエントリを削除すると同様の動作が生じるかどうか。 Goのランタイム:Runtime/Hashmap.go(function mapdelete())のマップ削除のソースコードを調査しましょう。調査により、キーと値の両方が削除時にクリアされていることが明らかになります(#600、#602)。先の尖ったオブジェクト。これにより、値自体がポインターである可能性がありますが、マップはそれらを参照しなくなります。その結果、先の尖ったオブジェクトは、他の参照がない場合、ガベージコレクションの対象となります。 ]

タイプポイントstruct { x、y int } var m = map [int]*point {} func main(){ fillmap() 削除(M、1) runtime.gc() time.sleep(time.second) fmt.println(m) } func fillmap(){ p:=&ポイント{1、2} runtime.setFinalizer(P、func(p *point){ fmt.printf( "ファイナライズ:%p%v \ n"、p、p) }) m [1] = p fmt.printf( "Put in Map:%p%v \ n"、p、p) } output:

in put in map:0x1040a128&{x:1 y:2} 確定:0x1040A128&{x:1 y:2} map []

この例では、ポインター値(p)がマップに入れられ、ファイナライザーがゴミ収集に呼び出されるように設定されています。マップからエントリを削除し、ガベージコレクションを強制した後、ファイナライザーが呼び出され、ポインターが実際にマップから削除されたことを証明します。分析と実用的な例では、ポインターのマップからエントリを削除すると、ではない
はメモリリークを引き起こすと結論付けることができます。 GOランタイムは、クリアされた値をゼロにすることにより、適切なガベージコレクションを保証し、他の参照が存在しないときに尖ったオブジェクトを取り戻すことができます。

リリースステートメント この記事は、侵害がある場合は1729686641に再現されています。勉強[email protected]に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3