Heim > Backend-Entwicklung > C++ > Hauptteil

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

Linda Hamilton
Freigeben: 2024-10-25 11:29:02
Original
590 Leute haben es durchsucht

## 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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!