Heim  >  Artikel  >  Backend-Entwicklung  >  Warum führt die Zuweisung von „stringstream.str().c_str()' zu einem „const char*' zu einem baumelnden Zeiger und wie kann dieses Problem gelöst werden?

Warum führt die Zuweisung von „stringstream.str().c_str()' zu einem „const char*' zu einem baumelnden Zeiger und wie kann dieses Problem gelöst werden?

Linda Hamilton
Linda HamiltonOriginal
2024-11-22 07:17:14154Durchsuche

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

Stringstream-, String- und char*-Konvertierungen verstehen

Eine häufige Verwirrung bei der Programmierung betrifft das Zusammenspiel zwischen Stringstream, String und char Konvertierungen. Ziel dieses Artikels ist es, zu klären, wo sich der von stringstream.str().c_str() zurückgegebene String im Speicher befindet und warum er nicht direkt einem const char zugewiesen werden kann.

Bei Verwendung von stringstream wird der str( )-Funktion gibt ein temporäres Zeichenfolgenobjekt zurück, das nur innerhalb des Ausdrucks existiert, in dem es aufgerufen wird. Dieses Zeichenfolgenobjekt wird normalerweise auf dem Stapel erstellt und zerstört, sobald der Ausdruck endet.

Sehen wir uns das bereitgestellte Codebeispiel an:

#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;
}

Das Problem tritt auf, wenn wir versuchen, das Ergebnis von zuzuweisen stringstream.str().c_str() zum const char* cstr2. Da die zurückgegebene Zeichenfolge temporär ist, wird sie nach Beendigung des Ausdrucks zerstört, sodass cstr2 auf einen baumelnden Zeiger zeigt. Folglich führt das Drucken von cstr2 zu Müll.

Behebung des Problems:

Um dieses Problem zu vermeiden, können wir entweder die temporäre Zeichenfolge in ein permanentes Zeichenfolgenobjekt kopieren und dieses abrufen Zeichenfolge im C-Stil oder Bindung der temporären Zeichenfolge an eine konstante Referenz, wodurch ihre Lebensdauer verlängert wird:

// 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();
}

Im geänderten Codebeispiel zeigen sowohl cstr als auch cstr2 zu gültigen Zeichenfolgen im C-Stil, die für die Lebensdauer des const-String-Objekts vorhanden sind. Dadurch können beide Zeichenfolgen korrekt gedruckt werden.

Es ist wichtig zu beachten, dass das Binden der temporären Zeichenfolge an eine Konstantenreferenz im Allgemeinen bevorzugt wird, da dadurch unnötiges Kopieren vermieden wird und eine effizientere und präzisere Lösung möglich ist.

Das obige ist der detaillierte Inhalt vonWarum führt die Zuweisung von „stringstream.str().c_str()' zu einem „const char*' zu einem baumelnden Zeiger und wie kann dieses Problem gelöst werden?. 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