Dalam bidang pengaturcaraan C, penggunaan rentetan sementara sering menimbulkan kebimbangan tentang pengurusan ingatan dan ketahanan mereka. Artikel ini menyelidiki secara spesifik penggunaan std::string::c_str() dengan rentetan sementara dan meneliti pematuhannya dengan piawai C.
Masalah:
Pertimbangkan coretan kod berikut:
void consumer(char const* p) { std::printf("%s", p); } std::string random_string_generator(); consumer(random_string_generator().c_str());
Adakah kod mempamerkan gelagat yang betul, atau adakah ia mempunyai potensi perangkap yang berkaitan dengan jangka hayat sementara?
Jawapan:
Mengikut piawaian C, selepas mencipta objek std::string sementara dan memperoleh penunjuk c_str(), hayat objek rentetan dilanjutkan sehingga:
Dalam contoh kod yang disediakan, objek std::string sementara (random_string_generator()) dimusnahkan pada penghujung ekspresi penuh, bukan sebelum atau selepas. Memandangkan pengguna digunakan dalam ungkapan yang sama, kod itu dianggap terbentuk dengan baik.
Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa jika pengguna menyimpan penunjuk untuk kegunaan masa hadapan, kod itu tidak lagi selamat. Ini kerana jangka hayat objek rentetan sementara akan tamat sebelum pengguna boleh mengakses penuding.
Kesimpulan:
Kod yang dimaksudkan sememangnya dibentuk dengan baik mengikut kepada standard C, selagi ia digunakan dalam ungkapan yang sama. Memahami peraturan jangka hayat untuk sementara adalah penting untuk mengelakkan isu pengurusan memori dan memastikan tingkah laku program yang betul.
Atas ialah kandungan terperinci Adakah selamat untuk menghantar `std::string::c_str()` sementara kepada fungsi dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!