Rumah > pembangunan bahagian belakang > C++ > Adakah Mengembalikan Pembolehubah Rujukan C Sentiasa Idea Buruk?

Adakah Mengembalikan Pembolehubah Rujukan C Sentiasa Idea Buruk?

Susan Sarandon
Lepaskan: 2024-12-19 12:29:09
asal
123 orang telah melayarinya

Is Returning a C   Reference Variable Always a Bad Idea?

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

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

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

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

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!

sumber:php.cn
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