Heim > Artikel > Backend-Entwicklung > Warum verursacht „stringstream.str().c_str()“ einen Speicherfehler in C?
Verwirrung bei Konvertierungen zwischen Stringstream, String und Char*
Dieses Problem tritt auf, wenn der von stringstream.str() erhaltene String konvertiert wird. c_str() in ein const char*. Das Verständnis der Speicherverwaltung und der Lebensdauer der zurückgegebenen Zeichenfolge ist entscheidend, um potenzielle Fehler zu vermeiden.
Das Code-Snippet veranschaulicht das Problem:
#include <string> #include <sstream> #include <iostream> 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; }
Die Annahme, dass stringstream.str().c_str( ) kann einem const char* zugewiesen werden, ist falsch. Dies führt zu einem Fehler, bei dem cstr2 Müll ausgibt.
Grundlegendes zur Speicherverwaltung
stringstream.str() gibt ein temporäres String-Objekt zurück, das nur bis zum Ende gültig ist des aktuellen Ausdrucks. Wenn der Ausdruck abgeschlossen ist, wird das temporäre Objekt zerstört und der Zeiger auf seine Daten (zurückgegeben von c_str()) wird ungültig.
Fehler beheben
Auflösen Um dieses Problem zu lösen, muss das temporäre Zeichenfolgenobjekt in einer separaten Variablen gespeichert werden, z. B.:
const std::string tmp = stringstream.str(); const char* cstr2 = tmp.c_str();
Durch die Speicherung des temporären Objekts in tmp wird die Lebensdauer des Zeigers verlängert und das Drucken von cstr2 funktioniert jetzt korrekt.
Bonuspunkte-Erklärung
Im geänderten Codeblock:
cout << cstr // Prints correctly << ss.str().c_str() // Prints correctly << cstr2; // Prints correctly (???)
Alle Druckanweisungen funktionieren jetzt korrekt, weil:
Das obige ist der detaillierte Inhalt vonWarum verursacht „stringstream.str().c_str()“ einen Speicherfehler in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!