Apakah yang berlaku kepada penuding kepada elemen apabila Go mengalihkan kepingan ke lokasi lain dalam ingatan?

WBOY
Lepaskan: 2024-02-08 22:00:27
ke hadapan
444 orang telah melayarinya

当 Go 将切片移动到内存中的另一个位置时,指向元素的指针会发生什么?

Dalam bahasa Go, apabila hirisan dialihkan ke lokasi lain dalam ingatan, penunjuk kepada elemen berubah. Memandangkan kepingan ialah tatasusunan dinamik, struktur data asasnya mengandungi penunjuk kepada elemen tatasusunan serta maklumat panjang dan kapasiti kepingan itu. Apabila hirisan diagihkan semula atau dikembangkan, penunjuk elemen yang ditunjuknya pada asalnya tidak lagi sah. Oleh itu, jika penuding sebelumnya masih digunakan selepas kepingan dialihkan, ia boleh menyebabkan lokasi memori yang salah diakses atau pengecualian lain mungkin dilemparkan. Untuk mengelakkan ini, kita harus mendapatkan semula penunjuk kepada elemen selepas hirisan dialihkan untuk memastikan kesahihan dan ketepatan penunjuk. Dengan memperoleh semula penuding, kami boleh terus memanipulasi dan mengakses elemen dengan betul dalam hirisan selepas hirisan dialihkan.

Kandungan soalan

Saya ada kod berikut

package main

import "fmt"

func main() {
    a := []int{1}
    b := &a[0]
    fmt.Println(a, &a[0], b, *b) // prints [1] 0xc00001c030 0xc00001c030 1

    a = append(a, 1, 2, 3)
    fmt.Println(a, &a[0], b, *b) // prints [1 1 2 3] 0xc000100020 0xc00001c030 1
}
Salin selepas log masuk

Mula-mula ia mencipta sekeping 1 int. Lennya ialah 1 dan penutupnya juga 1. Saya kemudian mendapatkan penunjuk kepada elemen pertamanya dan dalam cetakan mendapatkan nilai penunjuk asas. Seperti yang dijangka, ia berfungsi dengan baik.

Saya kemudian memanjangkan kapasiti hirisan dengan menambahkan 3 elemen padanya, sekali gus menyalinnya ke lokasi lain dalam ingatan. Selepas itu, saya mencetak alamat elemen pertama kepingan (dengan mendapatkan penunjuk), yang kini berbeza daripada alamat yang disimpan dalam b .

Tetapi apabila saya mencetak nilai asas b 的基础值时,它也可以正常工作。我不明白为什么它有效。据我所知,第一个元素 b ia juga berfungsi dengan baik. Saya tidak faham mengapa ia berfungsi. Setahu saya, hirisan yang ditunjuk oleh elemen pertama

telah disalin ke lokasi lain dalam ingatan, jadi ingatan sebelum itu mesti telah dibebaskan. Namun, nampaknya masih ada.

Jika kita melihat pada peta, golang tidak membenarkan kita membuat penunjuk pada elemen mengikut kekunci kerana masalah yang sama - data asas boleh dialihkan ke lokasi lain dalam ingatan. Walau bagaimanapun, ia berfungsi dengan baik untuk menghiris. Mengapa ini berlaku? Bagaimana sebenarnya ia berfungsi? Adakah memori tidak dibebaskan kerana masih terdapat pembolehubah yang menunjuk kepadanya? Bagaimanakah ia berbeza daripada peta?

Penyelesaian

Apakah yang berlaku kepada penuding kepada elemen apabila Go mengalihkan kepingan ke lokasi lain dalam ingatan?

Tiada apa-apa.

b[W] Apabila saya mencetak nilai asas

ia juga berfungsi dengan baik. Saya tidak faham mengapa ia berfungsi.

Mengapa ia tidak berkesan?

bLokasi memori yang asalnya ditunjuk masih wujud, tidak berubah. Selagi apa-apa (mis.

) masih merujuknya, ia akan tetap tersedia. Setelah semua rujukan kepada memori itu dialih keluar (iaitu keluar dari skop), pemungut sampah boleh membenarkannya digunakan oleh sesuatu yang lain. 🎜

Atas ialah kandungan terperinci Apakah yang berlaku kepada penuding kepada elemen apabila Go mengalihkan kepingan ke lokasi lain dalam ingatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan