Heim  >  Artikel  >  Backend-Entwicklung  >  Warum verursacht „stringstream.str().c_str()“ einen Speicherfehler in C?

Warum verursacht „stringstream.str().c_str()“ einen Speicherfehler in C?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-15 05:01:02960Durchsuche

Why Does `stringstream.str().c_str()` Cause a Memory Error 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:

  • cstr und cstr2
  • ss.str().c_str() ist eine temporäre Zeichenfolge, die an eine konstante Referenz gebunden ist und so ihre Lebensdauer verlängert.

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!

Stellungnahme:
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