Heim > Backend-Entwicklung > C++ > Warum führt die Zuweisung von „stringstream.str().c_str()' zu einem „const char*' zu einer Müllausgabe?

Warum führt die Zuweisung von „stringstream.str().c_str()' zu einem „const char*' zu einer Müllausgabe?

Barbara Streisand
Freigeben: 2024-11-16 17:16:03
Original
509 Leute haben es durchsucht

Why Does Assigning `stringstream.str().c_str()` to a `const char*` Lead to Garbage Output?

Verwirrung bei der Konvertierung von stringstream, string und char*

Dieser Artikel befasst sich mit dem Problem der Zuweisung eines const char* zum von stringstream zurückgegebenen String .str().c_str().

Problemerklärung

stringstream.str() erstellt ein temporäres String-Objekt, das am Ende des Ausdrucks zerstört wird. Wenn Sie diese temporäre Zeichenfolge einem const char* zuweisen, verweist der Zeiger auf die gelöschte Zeichenfolge, was zu einer fehlerhaften Ausgabe führt.

Hier ist ein Beispiel:

stringstream ss("this is a string\n");
const char* cstr = ss.str().c_str();
Nach dem Login kopieren

Im obigen Code nach dem Ausdruck endet, wird die von stringstream.str() erstellte temporäre Zeichenfolge gelöscht, was dazu führt, dass cstr auf einen ungültigen Speicherort zeigt.

Lösung

Um dieses Problem zu beheben, muss der Die temporäre Zeichenfolge sollte in ein anderes Zeichenfolgenobjekt kopiert werden, bevor sie in ein const char* konvertiert wird. Dies kann mit dem folgenden Ansatz erreicht werden:

string tmp = stringstream.str();
const char* cstr = tmp.c_str();
Nach dem Login kopieren

Bonuspunkte-Erklärung

Der folgende geänderte Code gibt die Zeichenfolgen korrekt aus:

cout << cstr << ss.str().c_str() << cstr2;
Nach dem Login kopieren

Diese Änderung funktioniert, weil:

  • cstr auf ein const char* zeigt, das aus einem String-Objekt mit bekannter Lebensdauer erstellt wurde.
  • ss.str().c_str() gibt zurück ein const char*, das auf die temporäre Zeichenfolge zeigt, die jetzt durch die von stringstream.str() zurückgegebene const-Referenz geschützt ist
  • cstr2 zeigt auf dieselbe temporäre Zeichenfolge wie ss.str().c_str(), aber es ist nicht const, also kann es einem temporären char* zugewiesen werden, das am Ende der cout-Anweisung zerstört wird.

Das obige ist der detaillierte Inhalt vonWarum führt die Zuweisung von „stringstream.str().c_str()' zu einem „const char*' zu einer Müllausgabe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage