Rumah > pembangunan bahagian belakang > C++ > Mengapa Rentetan Sementara Kekal Sah Selepas Fungsi Yang Menciptanya Dikembalikan?

Mengapa Rentetan Sementara Kekal Sah Selepas Fungsi Yang Menciptanya Dikembalikan?

Patricia Arquette
Lepaskan: 2024-12-14 16:31:11
asal
108 orang telah melayarinya

Why Does a Temporary String Remain Valid After the Function That Created It Returns?

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:

  • Keluar sementara ialah dicipta dalam fungsi foo().
  • Ungkapan foo().c_str() kemudian mengakses ahli c_str() keluar dan mengembalikan penunjuk const char* sementara.

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()      |           |
|                     |           |           |           |
|--------------------|           |           |           |
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan