Memahami Pulangan Tersirat dalam Fungsi C
Dalam C , apabila menghantar rentetan literal kepada fungsi, pengkompil secara tersirat menukarnya kepada std:: objek rentetan. Walau bagaimanapun, dalam contoh berikut, kami mengembalikan literal rentetan gaya C daripada fungsi std::string:
<code class="cpp">std::string myFunction() { return "it's me!!"; }</code>
Ini menimbulkan kebimbangan kerana pembina std::string dipanggil secara tersirat di sini mencipta salinan rentetan literal. Apabila fungsi kembali, salinan ini harus diagihkan, meninggalkan penuding berjuntai.
Apa Yang Berlaku Apabila Anda Menghubungi c_str()?
Walau bagaimanapun, memanggil myFunction(). c_str() mengembalikan penunjuk kepada data yang disimpan dalam objek std::string. Penunjuk ini menghala ke memori yang sama yang memegang rentetan literal, walaupun selepas objek std::string diagihkan.
Mengapa Ini Berfungsi (Semacam)
The sebab kod ini nampaknya berfungsi adalah disebabkan oleh keanehan pengurusan memori sistem pengendalian. Apabila blok memori diagihkan, OS tidak selalu mengosongkan kandungannya. Ini bermakna bahawa data literal rentetan masih wujud dalam ingatan, walaupun secara teknikalnya tidak boleh dicapai.
Tingkah Laku dan Nasib Tidak Ditakrifkan
Adalah penting untuk ambil perhatian bahawa tingkah laku ini tidak ditentukan mengikut piawaian C. Ini bermakna apa-apa sahaja boleh berlaku, termasuk ranap atau hasil yang salah. Ia berfungsi dalam sesetengah kes bukan kerana amalan C yang betul, tetapi kerana butiran pelaksanaan OS.
Oleh itu, adalah penting untuk mengelak daripada bergantung pada tingkah laku ini dan sentiasa memastikan bahawa data diperuntukkan dengan betul dan diagihkan dalam kod C anda .
Atas ialah kandungan terperinci Mengapa Adakah `c_str()` Berfungsi pada Deallocated `std::string` dalam Kes Ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!