Rumah > pembangunan bahagian belakang > C++ > Mengapakah memberikan `stringstream.str().c_str()` kepada `const char*` membawa kepada penuding berjuntai-juntai dan bagaimanakah isu ini boleh diselesaikan?

Mengapakah memberikan `stringstream.str().c_str()` kepada `const char*` membawa kepada penuding berjuntai-juntai dan bagaimanakah isu ini boleh diselesaikan?

Linda Hamilton
Lepaskan: 2024-11-22 07:17:14
asal
225 orang telah melayarinya

Why does assigning `stringstream.str().c_str()` to a `const char*` lead to a dangling pointer, and how can this issue be resolved?

Memahami Penukaran Stringstream, String dan char*

Satu kekeliruan biasa dalam pengaturcaraan melibatkan interaksi antara aliran rentetan, rentetan dan char penukaran. Artikel ini bertujuan untuk menjelaskan tempat rentetan dikembalikan daripada stringstream.str().c_str() berada dalam ingatan dan mengapa ia tidak boleh diberikan terus kepada const char.

Apabila menggunakan stringstream, str( ) fungsi mengembalikan objek rentetan sementara yang wujud hanya dalam ungkapan di mana ia dipanggil. Objek rentetan ini biasanya dibuat pada tindanan dan dimusnahkan sebaik sahaja ungkapan tamat.

Mari kita periksa contoh kod yang disediakan:

#include <string>
#include <sstream>
#include <iostream>

using namespace std;

int main()
{
    stringstream ss("this is a string\n");

    string str(ss.str());

    const char* cstr1 = str.c_str();

    const char* cstr2 = ss.str().c_str();

    cout << cstr1   // Prints correctly
        << cstr2;   // ERROR, prints out garbage

    system("PAUSE");

    return 0;
}
Salin selepas log masuk

Isu timbul apabila kita cuba memberikan hasil daripada stringstream.str().c_str() kepada const char* cstr2. Memandangkan rentetan yang dikembalikan adalah sementara, ia dimusnahkan selepas ungkapan tamat, menjadikan cstr2 menunjuk ke penunjuk berjuntai. Akibatnya, pencetakan cstr2 menghasilkan sampah.

Menyelesaikan isu:

Untuk mengelakkan isu ini, kita boleh sama ada menyalin rentetan sementara ke objek rentetan kekal dan mendapatkannya Rentetan gaya C atau ikat rentetan sementara pada rujukan const, memanjangkan hayatnya:

// Copy to a permanent string
const std::string tmp = stringstream.str();
const char* cstr = tmp.c_str();

// Bind to a const reference
{
  const std::string&amp; tmp = stringstream.str();   
  const char* cstr = tmp.c_str();
}
Salin selepas log masuk

Dalam contoh kod yang diubah suai, kedua-dua cstr dan cstr2 menunjuk kepada rentetan gaya C yang sah yang wujud untuk sepanjang hayat objek rentetan const. Akibatnya, kedua-dua rentetan boleh dicetak dengan betul.

Adalah penting untuk ambil perhatian bahawa mengikat rentetan sementara kepada rujukan const biasanya lebih disukai kerana ia mengelakkan penyalinan yang tidak perlu dan membolehkan penyelesaian yang lebih cekap dan ringkas.

Atas ialah kandungan terperinci Mengapakah memberikan `stringstream.str().c_str()` kepada `const char*` membawa kepada penuding berjuntai-juntai dan bagaimanakah isu ini boleh diselesaikan?. 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