Ketidaksahihan std::string.c_str() Nilai Pulangan
Dalam C , mengembalikan penunjuk aksara malar (char*) yang diperoleh daripada contoh std::string menggunakan kaedah c_str() menimbulkan isu yang berpotensi. Ini boleh membawa kepada tingkah laku yang tidak ditentukan kerana ketidaksahihan penuding sebaik sahaja objek std::string dimusnahkan.
Pertimbangkan contoh berikut:
const char* returnCharPtr() { std::string someString; // Some processing! return someString.c_str(); }
Dalam kod ini, std: : objek string bernama someString dicipta secara tempatan dalam fungsi. Selepas beberapa pemprosesan, tatasusunan aksara dalamannya diakses melalui kaedah c_str() dan penuding kepada tatasusunan ini dikembalikan.
Walau bagaimanapun, apabila skop fungsi tamat, someString dimusnahkan dan memori yang diperuntukkan dikeluarkan. Akibatnya, penuding yang dikembalikan oleh c_str() akan menjadi penuding berjuntai, menunjuk ke memori yang tidak lagi sah.
Resolusi
Untuk mengelakkan isu ini, terdapat beberapa pendekatan yang mungkin:
Contoh
Menggunakan std::string return type:
std::string returnString() { std::string someString("something"); return someString; }
Fungsi ini kini mengembalikan salinan rentetan yang sah, mengelakkan sebarang penunjuk berjuntai yang berpotensi.
Atas ialah kandungan terperinci Mengapakah mengembalikan `std::string.c_str()` berbahaya, dan bagaimanakah saya boleh mengelakkan tingkah laku yang tidak ditentukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!