Masalah:
Walaupun dokumentasi menasihatkan berhati-hati apabila memanipulasi hirisan penunjuk , tidak jelas sama ada langkah berjaga-jaga yang serupa diperlukan untuk peta penunjuk. Khususnya, patutkah entri ditetapkan kepada sifar sebelum pemadaman atau keseluruhan peta dikosongkan? Adakah pemungut sampah akan mengendalikan alokasi memori dengan secukupnya?
Penyiasatan:
Memeriksa kod sumber masa jalan Go (runtime/hashmap.go) mendedahkan bahawa storan kunci dan nilai adalah dikosongkan semasa pemadaman peta, mensifarkan sebarang penunjuk yang terkandung di dalamnya.
Bukti melalui Contoh:
Kod berikut menunjukkan ketiadaan kebocoran memori:
<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>
Output:
Put in map: 0x1040a128 &{X:1 Y:2} Finalized: 0x1040a128 &{X:1 Y:2} map[]
Contoh ini menggunakan penuding kepada struct, mendaftarkan pemuktamad untuk mengesan apabila penuding menjadi tidak dapat dicapai, dan kemudian memadamkan entri peta yang sepadan. Walaupun tiada rujukan lain kepada penunjuk, pemuktamadnya dipanggil untuk pengumpulan sampah, yang menunjukkan penyingkirannya daripada peta.
Kesimpulan:
Berdasarkan pemeriksaan kod sumber dan ujian contoh, mengosongkan entri atau keseluruhan peta sebelum pemadaman tidak diperlukan dalam Go. Pengumpul sampah akan mengendalikan urusan pembahagian memori dengan betul walaupun apabila peta mengandungi penunjuk.
Atas ialah kandungan terperinci Adakah Peta Penunjuk dalam Go Memerlukan Pengendalian Khas untuk Kebocoran Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!