Mengapa Memanggil `c_str()` pada Deallocated `std::string` Dikembalikan daripada Fungsi Nampak Berfungsi, Tetapi Sebenarnya Membawa kepada Gelagat Tidak Ditakrifkan?

Susan Sarandon
Lepaskan: 2024-10-26 04:16:02
asal
929 orang telah melayarinya

Why Does Calling `c_str()` on a Deallocated `std::string` Returned from a Function Seem to Work, But Actually Leads to Undefined Behavior?

Mengapa Mengembalikan Huruf Rentetan C daripada std::string Fungsi dan Memanggil c_str() Boleh Membawa kepada Tingkah Laku Tidak Ditakrifkan

Dalam kuliah baru-baru ini, anda mungkin telah menemui serpihan kod C yang mencetuskan beberapa kekeliruan:

<code class="cpp">std::string myFunction() { return "it's me!!"; }

int main() {
  const char* tempString = myFunction().c_str();
  char myNewString[100] = "Who is it?? - ";
  strcat(myNewString, tempString);
  printf("The string: %s", myNewString);
}</code>
Salin selepas log masuk

Adalah boleh difahami untuk menganggap bahawa kod ini akan gagal kerana "kembali 'itu saya!!'" secara tersirat memanggil pembina std::string dengan const char[]. Akibatnya, std::string yang dikembalikan daripada fungsi akan dialokasikan serta-merta apabila fungsi itu kembali. Walau bagaimanapun, yang menghairankan, kod tersebut dilaksanakan tanpa sebarang isu yang jelas.

Analisis kod anda adalah tepat. Tingkah laku yang dipamerkan di sini berada di bawah payung tingkah laku tidak ditentukan. Dalam kes sedemikian, kesannya boleh berbeza-beza secara meluas. Dalam contoh khusus ini, memori yang diperuntukkan untuk rentetan, walaupun ia diuruskan secara teknikal, masih menyimpan data asalnya apabila diakses. Fenomena ini kerap berlaku kerana sistem pengendalian tidak mengosongkan memori yang didelokasikan secara automatik, sebaliknya memilih untuk menandakannya sebagai tersedia untuk kegunaan masa hadapan.

Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa pengendalian deallocation memori bukanlah tanggungjawab C bahasa; ia adalah perincian rumit khusus untuk setiap pelaksanaan sistem pengendalian. Dari perspektif C, "tingkah laku tidak ditentukan" menangkap semua digunakan. Oleh itu, bergantung pada tingkah laku sedemikian amat tidak digalakkan kerana ia boleh membawa kepada keputusan yang tidak dapat diramalkan dan berkemungkinan membawa bencana dalam kod anda.

Atas ialah kandungan terperinci Mengapa Memanggil `c_str()` pada Deallocated `std::string` Dikembalikan daripada Fungsi Nampak Berfungsi, Tetapi Sebenarnya Membawa kepada Gelagat Tidak Ditakrifkan?. 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!