Seumur hidup std::string::c_str() Keputusan
Soalan:
Dalam atur cara yang berantaramuka dengan kod warisan yang menggunakan penunjuk char const, pembangun bertanya tentang jangka hayat std::string::c_str() keputusan. Mereka secara khusus bertanya sama ada coretan kod berikut selamat:
{ std::string server = "my_server"; std::string name = "my_name"; Foo foo; foo.server = server.c_str(); foo.name = name.c_str(); // use Foo // Foo about to be destroyed (before name and server) }
Jawapan:
Hayat std::string::c_str() keputusan bergantung pada hayat rentetan dan sebarang pengubahsuaian seterusnya. Hasilnya menjadi tidak sah jika rentetan diubah suai atau dimusnahkan. Oleh itu, membuat salinan hasil biasanya disyorkan apabila berhasrat untuk menyimpannya untuk kegunaan masa hadapan.
Dalam coretan kod yang disediakan, std::strings (pelayan dan nama) dicipta dan diubah suai dalam skop blok kod. Hasil c_str() (foo.server dan foo.name) menunjuk kepada std::strings sementara ini, yang dimusnahkan pada penghujung skop.
Walau bagaimanapun, rentetan tidak digunakan di luar skop , menjadikannya selamat secara teknikal untuk terus menggunakan penunjuk const char dalam use_foo() dan ~Foo(). Walau bagaimanapun, jika fungsi ini berpotensi menyalin penunjuk ke lokasi lain, salinan benar harus dibuat dan bukannya hanya menyalin penunjuk.
Oleh itu, sementara coretan kod menunjukkan tingkah laku yang betul secara teknikal dalam kes khusus ini, amalan pengekodan yang baik akan melibatkan membuat salinan hasil c_str() jika ia perlu disimpan untuk kegunaan kemudian.
Atas ialah kandungan terperinci Berapa Lama Penunjuk `std::string::c_str()` Kekal Sah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!