Seumur Hidup Sementara
Dalam C , sementara dicipta atas pelbagai sebab, seperti mengembalikan nilai daripada fungsi atau menilai ungkapan. Memahami jangka hayat sementara adalah penting untuk tingkah laku program yang betul.
Pertimbangkan coretan kod berikut:
std::string foo() { std::string out = something...; return out; } void bar(const char* ccp) { // do something with the string.. } bar(foo().c_str());
Dalam kod ini, rentetan sementara yang dicipta oleh foo() dirujuk oleh const char* penunjuk dalam panggilan ke bar(). Timbul persoalan: mengapa kod ini sah?
Jawapannya terletak pada seumur hidup sementara. Menurut piawaian C, objek sementara dimusnahkan apabila ungkapan penuh yang secara leksikal mengandungi nilai r yang mencipta objek itu dinilai sepenuhnya.
Dalam kod di atas, ungkapan penuh ialah bar(foo().c_str ()). Penilaian ungkapan ini bermula pada ' (kurungan terbuka) dan berakhir pada ')' terakhir (kurungan penutup). Dalam ungkapan ini, rentetan sementara dicipta dengan menilai foo(), dan kaedah c_str() dipanggil sementara.
Oleh itu, rentetan sementara wujud pada permulaan ungkapan penuh dan ialah dimusnahkan apabila ungkapan dinilai sepenuhnya, iaitu selepas panggilan ke bar(). Ini menerangkan sebab penunjuk const char* dalam bar() masih merujuk kepada rentetan yang sah.
Ringkasnya, sementara yang dikembalikan oleh foo() hanya dimusnahkan sebaik sahaja ungkapan lengkap yang mengandunginya telah dinilai, memastikan bahawa penunjuk yang dikembalikan oleh foo().c_str() kekal sah sepanjang panggilan ke bar().
Atas ialah kandungan terperinci Berapa Lama C Temporaries Hidup dan Mengapa Kod Ini Berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!