„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum scheint die Rückgabe eines C-String-Literals von einer std::string-Funktion manchmal zu funktionieren, ist aber immer noch ein undefiniertes Verhalten?

Warum scheint die Rückgabe eines C-String-Literals von einer std::string-Funktion manchmal zu funktionieren, ist aber immer noch ein undefiniertes Verhalten?

Veröffentlicht am 18.11.2024
Durchsuche:424

Why Does Returning a C String Literal from a std::string Function Seem to Work Sometimes, But is Still Undefined Behavior?

Rückgabe eines C-String-Literals von der std::string-Funktion und Aufruf von c_str()

In C ist das Zurückgeben eines C-String-Literal von einer std::string-Funktion ein Unüberlegtes Vorgehen, das zu undefiniertem Verhalten führen kann. Ein weit verbreitetes Missverständnis ist jedoch, dass dieser Code fehlschlagen sollte, obwohl er in einigen Fällen scheinbar funktioniert.

Wenn „Ich bin es!!“ an myFunction() übergeben wird, wird das C-String-Literal implizit in ein std::string-Objekt konvertiert. Das zurückgegebene std::string-Objekt zeigt auf seinen internen Zeichenpuffer, der eine Kopie des String-Literals enthält. Der Aufruf von c_str() für den std::string gibt einen Zeiger auf diesen Puffer zurück.

Das potenzielle Problem entsteht, weil der interne Zeichenpuffer des std::string-Objekts nicht im statischen Speicher gespeichert ist. Sobald die Funktion myFunction() zurückkehrt, werden das std::string-Objekt und sein interner Puffer zerstört. Dies bedeutet, dass der von c_str() erhaltene Zeiger zu einem baumelnden Zeiger wird, der auf freigegebenen Speicher zeigt.

In bestimmten Implementierungen und unter bestimmten Umständen kann es jedoch sein, dass das Betriebssystem den vom freigegebenen std::string verwendeten Speicher nicht sofort zurückgewinnt . Dies wird als Speicherpersistenz bezeichnet. Infolgedessen lässt das Betriebssystem fälschlicherweise zu, dass der Code weiterhin auf den freigegebenen Speicher zugreift, was den Eindruck erweckt, dass der Code ordnungsgemäß funktioniert.

Es ist wichtig zu betonen, dass dieses Verhalten in C nicht definiert ist. Der Sprachstandard definiert nicht, was in dieser Situation passiert, und verschiedene Implementierungen können sich unterschiedlich verhalten. Sich auf die Speicherpersistenz zu verlassen ist gefährlich und kann in unterschiedlichen Kontexten oder auf unterschiedlichen Betriebssystemen zu unerwarteten Fehlern führen.

Daher scheint der Beispielcode zwar in einigen Fällen zu funktionieren, er gilt jedoch dennoch als undefiniertes Verhalten und sollte dies auch sein vermieden. Um solche Probleme zu vermeiden, wird empfohlen, eine Kopie des String-Literals von der std::string-Funktion zurückzugeben, anstatt einen direkten Zeiger auf ihren internen Puffer.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3