Heim  >  Artikel  >  Backend-Entwicklung  >  Hier 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

Hier 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

Patricia Arquette
Patricia ArquetteOriginal
2024-10-25 09:23:02675Durchsuche

Here are a few title options that fit the question-answer format and accurately describe the article's content:

**Option 1 (Short & Direct):**

* **Why Does Calling `std::string.c_str()` on a Returned String Lead to Undefined Behavior?** 

**Option 2 (M

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!

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