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

Barbara Streisand
Lepaskan: 2024-11-06 22:51:03
asal
856 orang telah melayarinya

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());
Salin selepas log masuk

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!