Seumur Hidup Sementara Dilawati Semula
Coretan kod yang disediakan dalam soalan asal menunjukkan tingkah laku yang kelihatan paradoks apabila rentetan sementara dikembalikan oleh foo() kekal sah walaupun selepas ia didakwa telah dimusnahkan semasa masuk bar().
Bertentangan dengan andaian, objek sementara tidak dimusnahkan sepenuhnya apabila fungsi yang menciptanya selesai. Sebaliknya, hayatnya dilanjutkan sehingga keseluruhan ungkapan yang mengandungi sementara dinilai sepenuhnya.
Untuk menggambarkan konsep ini, mari kita pecahkan kod itu kepada komponennya:
Mengikut peraturan bahasa C, const char* sementara yang dihasilkan oleh foo().c_str() akan berterusan sehingga bar ekspresi penuh(foo(). ).c_str()) dinilai sepenuhnya. Ini bermakna penuding kekal sah walaupun selepas pelaksanaan foo() telah selesai.
Untuk memvisualisasikan gelagat ini, bayangkan garis masa berikut:
|--------------------|-----------|-----------|-----------| | | birth | funeral | | | | ^^^ | ^^^^ | | |--------------------| | | | | | bar() | | | | | | | | |--------------------| | | | | | | | evaluated | | | | | bar() | |--------------------| | | | | | | foo() | | | | | | | |--------------------| | | |
Objek sementara (rentetan keluar dan penunjuk const char*) dicipta apabila ungkapan foo().c_str() dinilai dan ia berterusan sehingga keseluruhan ungkapan bar(foo().c_str()) telah dinilai. Ini memastikan bahawa penuding yang diberikan kepada bar() masih sah apabila fungsi cuba mengakses rentetan.
Oleh itu, adalah betul untuk menganggap bahawa sementara yang dikembalikan oleh foo() akan dimusnahkan selepas panggilan ke bar() selesai, kerana ini menandakan berakhirnya ungkapan penuh yang mengandungi sementara.
Atas ialah kandungan terperinci Mengapa Rentetan Sementara Kekal Sah Selepas Fungsi Yang Menciptanya Dikembalikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!