Heim > Backend-Entwicklung > C++ > Hauptteil

Warum scheint der Aufruf von „c_str()' für einen freigegebenen „std::string', der von einer Funktion zurückgegeben wird, zu funktionieren, führt aber tatsächlich zu undefiniertem Verhalten?

Susan Sarandon
Freigeben: 2024-10-26 04:16:02
Original
928 Leute haben es durchsucht

Why Does Calling `c_str()` on a Deallocated `std::string` Returned from a Function Seem to Work, But Actually Leads to Undefined Behavior?

Warum die Rückgabe von C-String-Literalen von std::string-Funktionen und der Aufruf von c_str() zu undefiniertem Verhalten führen kann

In einem kürzlich gehaltenen Vortrag Möglicherweise sind Sie auf ein Fragment von C-Code gestoßen, das einige Verwirrung ausgelöst hat:

<code class="cpp">std::string myFunction() { return "it's me!!"; }

int main() {
  const char* tempString = myFunction().c_str();
  char myNewString[100] = "Who is it?? - ";
  strcat(myNewString, tempString);
  printf("The string: %s", myNewString);
}</code>
Nach dem Login kopieren

Es ist verständlich anzunehmen, dass dieser Code fehlschlagen würde, weil „return ‚it's me!!‘“ implizit den Konstruktor std::string aufruft mit einem const char[]. Folglich wird die Zuordnung des von der Funktion zurückgegebenen std::string sofort aufgehoben, wenn die Funktion zurückkehrt. Überraschenderweise wird der Code jedoch ohne erkennbare Probleme ausgeführt.

Ihre Analyse des Codes ist korrekt. Das hier gezeigte Verhalten fällt unter den Begriff undefiniertes Verhalten. In solchen Fällen können die Auswirkungen sehr unterschiedlich sein. In diesem speziellen Fall enthält der für die Zeichenfolge zugewiesene Speicher beim Zugriff immer noch die ursprünglichen Daten, auch wenn die Zuordnung technisch aufgehoben wurde. Dieses Phänomen tritt häufig auf, weil Betriebssysteme den freigegebenen Speicher nicht automatisch löschen, sondern ihn stattdessen als für die zukünftige Verwendung verfügbar markieren.

Es ist jedoch wichtig zu beachten, dass die Handhabung der Speicherfreigabe nicht in der Verantwortung des C liegt Sprache; Es handelt sich um ein kompliziertes Detail, das für jede Betriebssystemimplementierung spezifisch ist. Aus C-Perspektive gilt das Sammelbegriff „undefiniertes Verhalten“. Daher wird dringend davon abgeraten, sich auf ein solches Verhalten zu verlassen, da es zu unvorhersehbaren und möglicherweise katastrophalen Ergebnissen in Ihrem Code führen kann.

Das obige ist der detaillierte Inhalt vonWarum scheint der Aufruf von „c_str()' für einen freigegebenen „std::string', der von einer Funktion zurückgegeben wird, zu funktionieren, führt aber tatsächlich 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!