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