Mengapakah Mengembalikan Rentetan C Literal daripada Fungsi std::string Nampaknya Berfungsi Kadang-kadang, Tetapi Masih Kelakuan Tidak Ditakrifkan?

Barbara Streisand
Lepaskan: 2024-10-29 09:04:02
asal
992 orang telah melayarinya

Why Does Returning a C String Literal from a std::string Function Seem to Work Sometimes, But is Still Undefined Behavior?

Mengembalikan C String Literal daripada std::string Fungsi dan Memanggil c_str()

Dalam C , mengembalikan rentetan C literal daripada fungsi std::string ialah amalan yang tidak diingini yang boleh membawa kepada tingkah laku yang tidak jelas. Walau bagaimanapun, salah tanggapan yang biasa ialah kod ini sepatutnya gagal, sementara ia kelihatan berfungsi dalam beberapa kes.

Apabila "ini saya!!" dihantar ke myFunction(), literal rentetan C ditukar secara tersirat kepada objek std::string. Objek std::string yang dikembalikan menghala ke penimbal aksara dalamannya, yang mengandungi salinan literal rentetan. Memanggil c_str() pada std::string mengembalikan penunjuk kepada penimbal ini.

Potensi masalah timbul kerana penimbal aksara dalaman objek std::string tidak disimpan dalam memori statik. Setelah fungsi myFunction() kembali, objek std::string dan penimbal dalamannya dimusnahkan. Ini bermakna penuding yang diperoleh daripada c_str() menjadi penuding berjuntai yang menghala ke memori yang didelokasikan.

Walau bagaimanapun, dalam pelaksanaan tertentu dan keadaan tertentu, sistem pengendalian mungkin tidak segera menuntut semula memori yang digunakan oleh std::string yang didelokasikan. . Ini dikenali sebagai ketekunan ingatan. Akibatnya, sistem pengendalian tersilap membenarkan kod untuk terus mengakses memori yang didelokasikan, memberikan ilusi bahawa kod berfungsi dengan betul.

Adalah penting untuk menekankan bahawa tingkah laku ini tidak ditentukan dalam C . Standard bahasa tidak menentukan perkara yang berlaku dalam situasi ini, dan pelaksanaan yang berbeza mungkin berkelakuan berbeza. Bergantung pada kegigihan memori adalah berbahaya dan boleh membawa kepada ralat yang tidak dijangka dalam konteks yang berbeza atau pada sistem pengendalian yang berbeza.

Oleh itu, walaupun kod contoh mungkin kelihatan berfungsi dalam beberapa kes, ia masih dianggap sebagai tingkah laku yang tidak ditentukan dan harus dielakkan. Untuk mengelakkan isu sedemikian, adalah disyorkan untuk mengembalikan salinan literal rentetan daripada fungsi std::string dan bukannya penunjuk terus ke penimbal dalamannya.

Atas ialah kandungan terperinci Mengapakah Mengembalikan Rentetan C Literal daripada Fungsi std::string Nampaknya Berfungsi Kadang-kadang, Tetapi Masih Kelakuan Tidak Ditakrifkan?. 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