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.
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