Rumah > pembangunan bahagian belakang > C++ > Mengapakah memberikan stringstream::str().c_str() kepada const char* mengakibatkan ralat masa jalan?

Mengapakah memberikan stringstream::str().c_str() kepada const char* mengakibatkan ralat masa jalan?

Patricia Arquette
Lepaskan: 2024-11-16 04:46:06
asal
913 orang telah melayarinya

Why does assigning stringstream::str().c_str() to a const char* result in a runtime error?

Kekeliruan Penukaran: memahami gelagat aliran rentetan, rentetan dan char*

Kerisauan berputar di sekitar aliran rentetan, rentetan dan char* penukaran timbul daripada sifat sementara rentetan yang dikembalikan oleh stringstream.str().c_str(). Rentetan sementara ini, yang wujud hanya dalam jangka hayat ungkapan, terdedah kepada pemadaman apabila penyata selesai.

Seperti yang ditunjukkan dalam coretan kod yang disediakan, memberikan rentetan sementara kepada const char* membawa kepada ralat masa jalan, kerana penunjuk merujuk memori yang telah dikeluarkan. Output sampah yang terhasil ialah manifestasi ralat rujukan memori ini.

Untuk mengelakkan isu ini, seseorang boleh sama ada menyalin rentetan sementara ke lokasi yang lebih kekal, seperti objek rentetan lain, sebelum mendapatkan perwakilan rentetan C. Sebagai alternatif, jangka hayat rentetan sementara boleh dilanjutkan dengan mengikatnya pada rujukan const, seperti yang ditunjukkan di bawah:

{
  const std::string& tmp = stringstream.str();
  const char* cstr = tmp.c_str();
}
Salin selepas log masuk

Pendekatan ini memastikan rentetan itu kekal boleh diakses sepanjang skop rujukan.

Atas ialah kandungan terperinci Mengapakah memberikan stringstream::str().c_str() kepada const char* mengakibatkan ralat masa jalan?. 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