Adakah Mengembalikan Pembolehubah Rujukan C Jahat?
Amalan mengembalikan rujukan dalam C boleh membimbangkan, terutamanya apabila berurusan dengan timbunan- pembolehubah yang diperuntukkan atau objek yang dicipta secara dinamik. Mengembalikan rujukan yang berjuntai boleh mengakibatkan kebocoran memori dan tingkah laku yang tidak ditentukan.
Bahaya Memulangkan Pembolehubah Tindanan
Pertimbangkan contoh ini:
int& getInt() { int i; return i; // Don't do this! }
Dalam coretan ini, kami mengembalikan rujukan kepada pembolehubah yang diperuntukkan tindanan. Sebaik sahaja fungsi keluar, pembolehubah ini akan dimusnahkan, meninggalkan pemanggil dengan rujukan kepada ingatan tidak sah. Ini adalah resipi yang pasti untuk kerosakan memori dan kehilangan data.
Memulangkan Objek Yang Diperuntukkan Secara Dinamik
Walaupun mengembalikan rujukan kepada objek yang diperuntukkan secara dinamik mungkin kelihatan selamat, ia juga boleh menjadi rumit. Contohnya:
int& getInt() { int* i = new int; return *i; // Don't do this either! }
Kini, pemanggil mempunyai rujukan kepada integer yang diperuntukkan, tetapi apabila mereka cuba memadamkannya, mereka mesti menggunakan alamat rujukan:
int& myInt = getInt(); // Note the &, we cannot lose this reference! delete &myInt; // Must delete...very strange and evil int oops = getInt(); delete &oops; // Undefined behavior, we're wrongly deleting a copy
Ini boleh membawa kepada ralat masa jalan dan gelagat tidak ditentukan jika alamat asal hilang secara tidak sengaja.
Returning Smart Penunjuk
Untuk mengelakkan kemungkinan perangkap ini, pertimbangkan untuk menggunakan penunjuk pintar atau bekas, yang mengurus jangka hayat objek secara automatik. Contohnya:
std::unique_ptr<int> getInt() { return std::make_unique<int>(0); }
Dengan penunjuk pintar, pemanggil secara automatik mengambil alih pemilikan memori yang diperuntukkan, memastikan pembersihan sumber yang betul.
Apabila Memulangkan Rujukan Selamat
Terdapat keadaan yang mengembalikan rujukan sesuai, seperti mengembalikan rujukan kepada ahli kelas apabila jangka hayat objek dijamin lebih lama daripada panggilan. Selain itu, mengembalikan rujukan kepada nilai yang dikira boleh menjadi cekap dan intuitif.
Ringkasan
Memulangkan rujukan dalam C boleh menjadi mudah, tetapi ia mesti dilakukan dengan berhati-hati. Elakkan daripada mengembalikan rujukan kepada pembolehubah jangka pendek atau objek yang diperuntukkan secara dinamik tanpa pengurusan sumber yang betul. Apabila ragu-ragu, pertimbangkan untuk menggunakan petunjuk pintar atau nilai semantik. Jika jangka hayat sesuatu objek diurus secara eksplisit pada tahap yang lebih tinggi, secara amnya adalah selamat untuk mengembalikan rujukan kepada ahlinya.
Atas ialah kandungan terperinci Adakah Mengembalikan Pembolehubah Rujukan C Sentiasa Idea Buruk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!