Pengurusan Memori Penunjuk Dikembalikan: Amalan Selamat dalam Pergi
Dalam C, mengembalikan penunjuk kepada pembolehubah yang diperuntukkan tindanan boleh membawa kepada tingkah laku yang tidak ditentukan disebabkan oleh pemadaman memori apabila fungsi kembali. Ini menimbulkan persoalan sama ada gelagat serupa berlaku dalam Go dan sama ada selamat untuk mengembalikan penunjuk sedemikian.
Dalam Go, gelagatnya berbeza secara mengejutkan. Pengkompil tidak menghasilkan sebarang ralat untuk mengembalikan penunjuk yang diperuntukkan tindanan seperti contoh berikut:
package main import ( "fmt" ) func main() { fmt.Println(*(something())) } func something() *string { s := "a" return &s }
Tidak seperti C, kod dalam Go ini sah dengan sempurna dan tidak akan menghasilkan sebarang ralat masa jalan. Ini kerana Go menggunakan teknik canggih yang dikenali sebagai analisis melarikan diri.
Analisis melarikan diri ialah pengoptimuman pengkompil yang menentukan sama ada nilai atau penuding terlepas daripada skop fungsinya. Jika nilai atau penuding didapati terlepas, pengkompil meletakkannya pada timbunan sampah yang dikumpul dan bukannya pada timbunan. Dalam kes ini, penunjuk *s yang dikembalikan terlepas daripada skop fungsi something() dan oleh itu diletakkan pada timbunan.
Soalan Lazim Go menerangkan dengan ringkas peraturan berkenaan peruntukan memori: jika pengkompil tidak dapat membuktikan bahawa a pembolehubah tidak lagi dirujuk selepas fungsi kembali, ia memperuntukkan pembolehubah pada timbunan untuk mengelakkan ralat penunjuk berjuntai. Strategi ini menghapuskan keperluan untuk pengurusan memori manual dan memastikan bahawa data bertitik kekal boleh diakses selepas fungsi dikembalikan.
Untuk memerhati pengoptimuman analisis melarikan diri pengkompil semasa penyusunan, gunakan pilihan -gcflags -m. Pilihan ini akan memberikan cerapan tentang keputusan yang dibuat mengenai peruntukan timbunan dan timbunan.
Atas ialah kandungan terperinci Adakah Mengembalikan Penunjuk yang Diperuntukkan Tindanan Selamat dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!