Warum der Aufruf von std::string.c_str() für eine Funktion, die einen String zurückgibt, fehlschlägt
Bedenken Sie den folgenden Code:
<code class="cpp">std::string getString() { std::string str("hello"); return str; } int main() { const char* cStr = getString().c_str(); std::cout << cStr << std::endl; // Outputs garbage }</code>
Intuitiv würde man erwarten, dass die von getString() zurückgegebene temporäre Zeichenfolge im Gültigkeitsbereich von main() gültig bleibt. Dies ist jedoch falsch.
Das Problem liegt in der Lebensdauer temporärer Objekte in C. Ein temporäres Objekt wird am Ende des Ausdrucks, in dem es erstellt wurde, zerstört, es sei denn, es ist an eine Referenz gebunden oder wird zum Initialisieren eines benannten Objekts verwendet. In diesem Fall gibt getString() eine temporäre Zeichenfolge zurück, die am Ende des Ausdrucks in main() zerstört wird.
Folglich enthält cStr einen baumelnden Zeiger und seine Verwendung kann zu undefiniertem Verhalten führen. Um dieses Problem zu vermeiden, kann man eine benannte Variable oder Referenz verwenden, um die Gültigkeit der zurückgegebenen Zeichenfolge sicherzustellen. Zum Beispiel:
<code class="cpp">std::string returnedString = getString(); const char* cStr = returnedString.c_str(); std::cout << cStr << std::endl; // Safe</code>
Alternativ kann die temporäre Zeichenfolge direkt verwendet werden, ohne sie einer Variablen zuzuweisen:
<code class="cpp">std::cout << getString().c_str() << std::endl; // Also safe</code>
Das obige ist der detaillierte Inhalt vonHier sind einige Titeloptionen, die zum Frage-Antwort-Format passen und den Inhalt des Artikels genau beschreiben: **Option 1 (kurz und direkt):** * **Warum funktioniert der Aufruf von „std::string.c_str()' bei einem Re. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!