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
Lepaskan: 2024-11-06 17:51:02
asal
1002 orang telah melayarinya

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

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