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

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