Adakah Peta Penunjuk dalam Go Memerlukan Pengendalian Khas untuk Kebocoran Memori?

Susan Sarandon
Lepaskan: 2024-10-23 22:25:30
asal
1002 orang telah melayarinya

Do Maps of Pointers in Go Need Special Handling for Memory Leaks?

Kebocoran Memori dalam Go: Peta Penunjuk

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>
Salin selepas log masuk

Output:

Put in map: 0x1040a128 &{X:1 Y:2}
Finalized: 0x1040a128 &{X:1 Y:2}
map[]
Salin selepas log masuk

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!

sumber:php
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!