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
Lepaskan: 2024-12-09 07:01:07
asal
463 orang telah melayarinya

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

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

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

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

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