Memahami Mengapa std::string.c_str() pada Fungsi Mengembalikan Rentetan Gagal
Dalam C , apabila fungsi mengembalikan rentetan , ia berbuat demikian mengikut nilai. Ini bermakna rentetan yang dikembalikan ialah salinan rentetan asal, bukannya rujukan kepadanya. Ini berbeza daripada gelagat jenis terbina dalam lain, seperti integer atau terapung, yang dikembalikan melalui rujukan secara lalai.
Dalam contoh anda, fungsi getString() mengembalikan objek rentetan yang merupakan salinan daripada rentetan "hello." Salinan ini disimpan di lokasi sementara dalam ingatan. Baris const char* cStr = getString().c_str(); cuba mendapatkan rentetan gaya C yang mewakili rentetan yang dikembalikan. Walau bagaimanapun, kerana rentetan sementara telah pun dimusnahkan, penunjuk cStr kini menghala ke memori tidak sah.
Pemusnahan Objek Sementara
Penjelasan untuk tingkah laku ini terletak pada peraturan untuk objek sementara dalam C . Objek sementara ialah objek yang dicipta secara tersirat oleh pengkompil untuk mengelakkan penyalinan yang tidak perlu. Dalam kes anda, rentetan sementara yang dibuat oleh getString() ialah objek sementara.
Objek sementara dimusnahkan pada penghujung ungkapan penuh di mana ia dicipta. Ungkapan penuh ialah ungkapan yang bukan subungkapan bagi beberapa ungkapan lain. Dalam contoh anda, baris const char* cStr = getString().c_str(); adalah ungkapan penuh. Oleh itu, rentetan sementara yang dibuat oleh getString() dimusnahkan pada penghujung baris ini.
Mencegah Isu
Untuk mengelakkan isu ini, anda mempunyai beberapa pilihan:
Dengan mengikuti garis panduan ini, anda boleh mengelakkan masalah yang berkaitan dengan penunjuk berjuntai dan memastikan kod anda berfungsi dengan betul.
Atas ialah kandungan terperinci ## Mengapa `std::string.c_str()` Gagal Apabila Digunakan pada Fungsi Mengembalikan String dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!