Rumah >pembangunan bahagian belakang >C++ >Adakah `goto` Memintas Perlaksanaan Pemusnah dalam C ?
Bolehkah Goto Traverse Berfungsi Tanpa Menggunakan Pemusnah?
Salah tanggapan biasa berterusan yang goto melangkau bahagian kod, mengelakkan pelaksanaan pemusnah dan seumpamanya operasi. Salah faham ini amat ketara dalam perbincangan sekitar C .
Sekatan Skop
Bertentangan dengan kepercayaan popular, goto tidak boleh melintasi sempadan fungsi. Percubaan untuk melompat ke label yang ditakrifkan dalam fungsi yang berbeza mengakibatkan ralat pengkompil, seperti yang digambarkan di bawah:
void f() { int x = 0; goto lol; } int main() { f(); lol: return 0; }
Ralat: label 'lol' digunakan tetapi tidak ditakrifkan
Objek Pertimbangan Permulaan
Melompat merentasi pemulaan objek juga tidak dibenarkan. Jika anda cuba melangkau pemulaan objek, pengkompil akan membenderakan ralat:
int main() { goto lol; int x = 0; lol: return 0; }
Ralat: lompat ke label 'lol'
Ralat: dari sini
Ralat: melintasi pemulaan 'int x'
Skop-Khusus Pemusnahan
Objek dengan tempoh penyimpanan automatik dimusnahkan apabila keluar dari skopnya, tanpa mengira kaedah keluar. Oleh itu, Goto tidak boleh memintas pemusnahan objek:
struct T { T() { cout << "*T"; } ~T() { cout << "~T"; } }; int main() { { T t; goto lol; } lol: return 0; }
Output: *T~T
Sekatan Jenis Objek
Sambil melompat ke dalam skop objek bukan skalar secara amnya dilarang, terdapat pengecualian untuk objek dengan pembina lalai dan pemusnah remeh. Pengisytiharan tatasusunan tanpa pemula juga dikecualikan.
Kesimpulan
Goto, walaupun bukan celah yang memintas mekanisme skop C, boleh menyebabkan tingkah laku yang tidak diduga jika digunakan secara sembarangan. Namun begitu, sekatan yang digariskan di atas memberikan perlindungan terhadap penggunaan goto yang tidak disengajakan atau berbahaya. Oleh itu, ia tidak semestinya jahat seperti yang biasa dilihat tetapi harus digunakan dengan budi bicara.
Atas ialah kandungan terperinci Adakah `goto` Memintas Perlaksanaan Pemusnah dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!