Rumah >pembangunan bahagian belakang >C++ >Adakah selamat untuk menghantar `std::string::c_str()` sementara kepada fungsi dalam C ?

Adakah selamat untuk menghantar `std::string::c_str()` sementara kepada fungsi dalam C ?

Barbara Streisand
Barbara Streisandasal
2024-11-06 22:51:03939semak imbas

Is it safe to pass a temporary `std::string::c_str()` to a function in C  ?

Memeriksa Ketahanan Rentetan Sementara dalam std::string::c_str()

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:

  • Kaedah bukan const bagi objek rentetan dipanggil
  • Objek rentetan dimusnahkan secara eksplisit

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!

Kenyataan:
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