Rumah > Artikel > pembangunan bahagian belakang > Adakah Selamat Digunakan `std::string::c_str()` dengan Temporary Strings dalam C ?
Potensi Perangkap Penggunaan std::string::c_str() dengan Rentetan Sementara
Pertimbangkan coretan kod C berikut:
void consumer(char const* p) { std::printf("%s", p); } std::string random_string_generator(); consumer(random_string_generator().c_str());
Kod ini menimbulkan persoalan sama ada ia dibentuk dengan baik mengikut piawaian C.
Kebimbangan berpunca daripada fakta bahawa random_string_generator() mengembalikan objek std::string sementara. Kami kemudian mengambil penunjuk c_str(), yang berpotensi meninggalkan objek std::string sementara terdedah kepada kemusnahan sebelum penunjuk digunakan.
Untuk memahami implikasi, kita perlu menyelidiki jangka hayat sementara dalam C .
Menurut piawaian C, jangka hayat sementara dilanjutkan sehingga akhir ungkapan penuh di mana ia dicipta. Dalam kes ini, ungkapan penuh ialah panggilan kepada pengguna. Oleh itu, objek std::string sementara tidak akan dimusnahkan sehingga selepas fungsi pengguna selesai melaksanakan.
Oleh itu, penunjuk c_str() yang kami perolehi akan kekal sah sepanjang panggilan kepada pengguna, menjadikan kod kami baik. -dibentuk dan selamat digunakan.
Adalah penting untuk ambil perhatian bahawa jaminan ini hanya berlaku sepanjang hayat ekspresi penuh. Jika penunjuk c_str() disimpan dan digunakan di luar konteks ini, gelagat menjadi tidak ditentukan kerana objek std::string sementara mungkin telah dimusnahkan.
Atas ialah kandungan terperinci Adakah Selamat Digunakan `std::string::c_str()` dengan Temporary Strings dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!