Heim  >  Artikel  >  Backend-Entwicklung  >  ## Warum schlägt `std::string.c_str()` fehl, wenn es für eine Funktion verwendet wird, die einen String in C zurückgibt?

## Warum schlägt `std::string.c_str()` fehl, wenn es für eine Funktion verwendet wird, die einen String in C zurückgibt?

Linda Hamilton
Linda HamiltonOriginal
2024-10-26 12:30:29672Durchsuche

## Why Does `std::string.c_str()` Fail When Used on a Function Returning a String in C  ?

Verstehen, warum std::string.c_str() für eine Funktion bei der Rückgabe eines Strings fehlschlägt

In C, wenn eine Funktion einen String zurückgibt , es geschieht nach Wert. Dies bedeutet, dass die zurückgegebene Zeichenfolge eine Kopie der ursprünglichen Zeichenfolge und kein Verweis darauf ist. Dies unterscheidet sich vom Verhalten anderer integrierter Typen wie Ganzzahlen oder Gleitkommazahlen, die standardmäßig per Referenz zurückgegeben werden.

In Ihrem Beispiel gibt die Funktion getString() ein String-Objekt zurück, das eine Kopie ist der Zeichenfolge „Hallo.“ Diese Kopie wird an einem temporären Ort im Speicher gespeichert. Die Zeile const char* cStr = getString().c_str(); versucht, eine Zeichenfolge im C-Stil abzurufen, die die zurückgegebene Zeichenfolge darstellt. Da die temporäre Zeichenfolge jedoch bereits zerstört wurde, zeigt der Zeiger cStr nun auf ungültigen Speicher.

Die Zerstörung temporärer Objekte

Die Erklärung für dieses Verhalten liegt in die Regeln für temporäre Objekte in C . Ein temporäres Objekt ist ein Objekt, das implizit vom Compiler erstellt wird, um unnötiges Kopieren zu vermeiden. In Ihrem Fall ist die von getString() erstellte temporäre Zeichenfolge ein temporäres Objekt.

Temporäre Objekte werden am Ende des vollständigen Ausdrucks, in dem sie erstellt wurden, zerstört. Ein vollständiger Ausdruck ist ein Ausdruck, der kein Unterausdruck eines anderen Ausdrucks ist. In Ihrem Beispiel ist die Zeile const char* cStr = getString().c_str(); ist ein vollständiger Ausdruck. Daher wird die von getString() erstellte temporäre Zeichenfolge am Ende dieser Zeile zerstört.

Problem verhindern

Um dieses Problem zu verhindern, haben Sie mehrere Möglichkeiten:

  • Speichern Sie die zurückgegebene Zeichenfolge in einer benannten Variablen, bevor Sie eine Zeichenfolge im C-Stil extrahieren.
  • Binden Sie die zurückgegebene Zeichenfolge an eine konstante L-Wert-Referenz oder R-Wert-Referenz.
  • Verwenden Sie den Zeichenfolgenzeiger im C-Stil, bevor die temporäre Zeichenfolge zerstört wird.

Durch Befolgen dieser Richtlinien können Sie die Probleme im Zusammenhang mit baumelnden Zeigern vermeiden und sicherstellen, dass sich Ihr Code korrekt verhält.

Das obige ist der detaillierte Inhalt von## Warum schlägt `std::string.c_str()` fehl, wenn es für eine Funktion verwendet wird, die einen String in C zurückgibt?. 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