Rumah >pembangunan bahagian belakang >C++ >Mengapakah penunjuk `c_str()` bagi objek rentetan sementara sah dalam `bar()` selepas fungsi ciptaannya `foo()` telah kembali?

Mengapakah penunjuk `c_str()` bagi objek rentetan sementara sah dalam `bar()` selepas fungsi ciptaannya `foo()` telah kembali?

Linda Hamilton
Linda Hamiltonasal
2024-12-09 07:01:07390semak imbas

Why is the `c_str()` pointer of a temporary string object valid in `bar()` after its creating function `foo()` has returned?

Hayat Objek dalam foo() dan bar()

Dalam C , objek yang dicipta semasa panggilan fungsi dianggap sebagai objek sementara. Memahami jangka hayat mereka adalah penting untuk memastikan tingkah laku program yang betul.

Pertimbangkan 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() );

Soalan:

Mengapa c_str( ) penunjuk objek sementara yang dikembalikan oleh foo() sah dalam fungsi bar() walaupun selepas foo() mempunyai selesai?

Jawapan:

Menurut piawaian C, objek sementara dimusnahkan sebaik sahaja ungkapan penuh yang mengandungi penciptaannya selesai. Dalam kes ini, ungkapan penuh ialah:

bar( foo().c_str() );

Dalam seni ASCII, jangka hayat objek sementara kelihatan seperti ini:

____________________   full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
     ^^^^^          ^
       |            |
     birth       funeral

Objek sementara dicipta apabila foo() dipanggil (kelahiran) dan dimusnahkan selepas ungkapan selesai melaksanakan (pengebumian), memastikan bahawa penunjuk c_str() kekal sah sepanjang pelaksanaan bar().

Atas ialah kandungan terperinci Mengapakah penunjuk `c_str()` bagi objek rentetan sementara sah dalam `bar()` selepas fungsi ciptaannya `foo()` telah kembali?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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