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!