Heim  >  Artikel  >  Backend-Entwicklung  >  ## Warum führt der Aufruf von „std::string.c_str()“ für einen zurückgegebenen String zu undefiniertem Verhalten?

## Warum führt der Aufruf von „std::string.c_str()“ für einen zurückgegebenen String zu undefiniertem Verhalten?

Linda Hamilton
Linda HamiltonOriginal
2024-10-25 11:29:02591Durchsuche

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

Warum schlägt der Aufruf von std::string.c_str() für eine zurückgegebene Zeichenfolge fehl?

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>

Wie zu erwarten ist, gibt getString() eine Kopie seines lokalen Strings zurück und hält ihn scheinbar in main() am Leben. Der Code gibt jedoch unerwartet Müll aus. Dies wirft die Frage auf: Wann und warum wird die zurückgegebene Zeichenfolge zerstört?

Die Antwort liegt in der Natur der Provisorien in C. getString() gibt einen temporären std::string zurück, der innerhalb der Funktion erstellt und nach Abschluss der Anweisung, in der er zurückgegeben wird, zerstört wird. Dies bedeutet, dass zu dem Zeitpunkt, an dem cStr auf das zugrunde liegende Zeichenarray der Zeichenfolge verweist, das temporäre Element bereits zerstört wurde und cStr zu einem baumelnden Zeiger wird, was zu undefiniertem Verhalten führt.

Um dieses Problem zu beheben, kann das zurückgegebene temporäre Element sein an eine benannte Variable oder Referenz gebunden, wodurch ihre Lebensdauer verlängert wird, bis der Gültigkeitsbereich der Referenz endet:

<code class="cpp">std::string s1 = getString(); // s1 is initialized with a copy of the temporary
auto& s2 = getString(); // s2 binds to the temporary by reference</code>

Alternativ kann der Zeiger auf das zugrunde liegende Zeichenarray verwendet werden, bevor das Temporäre zerstört wird:

<code class="cpp">std::cout << getString().c_str() << std::endl; // Temporary is destroyed after the expression completes</code>

Das obige ist der detaillierte Inhalt von## Warum führt der Aufruf von „std::string.c_str()“ für einen zurückgegebenen String zu undefiniertem Verhalten?. 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