Rumah >pembangunan bahagian belakang >C++ >Adakah Selamat Digunakan `std::string::c_str()` dengan Temporary Strings dalam C ?

Adakah Selamat Digunakan `std::string::c_str()` dengan Temporary Strings dalam C ?

Patricia Arquette
Patricia Arquetteasal
2024-11-06 17:51:02925semak imbas

Is it Safe to Use `std::string::c_str()` with Temporary Strings in 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!

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