Implizite Rückgabe in einer C-Funktion verstehen
Wenn in C ein String-Literal an eine Funktion übergeben wird, konvertiert der Compiler es implizit in a std::string-Objekt. Im folgenden Beispiel geben wir jedoch ein String-Literal im C-Stil von einer std::string-Funktion zurück:
<code class="cpp">std::string myFunction() { return "it's me!!"; }</code>
Dies gibt Anlass zur Sorge, da der hier implizit aufgerufene std::string-Konstruktor eine Kopie von erstellt das String-Literal. Wenn die Funktion zurückkehrt, sollte die Zuordnung dieser Kopie aufgehoben werden, sodass ein baumelnder Zeiger zurückbleibt.
Was passiert, wenn Sie c_str() aufrufen?
Der Aufruf von myFunction(). c_str() gibt einen Zeiger auf die im std::string-Objekt gespeicherten Daten zurück. Dieser Zeiger zeigt auf denselben Speicher, der das String-Literal enthielt, auch nachdem die Zuordnung des std::string-Objekts aufgehoben wurde.
Warum das funktioniert (sozusagen)
Das Der Grund, warum dieser Code zu funktionieren scheint, liegt an einer Fehlfunktion der Speicherverwaltung des Betriebssystems. Wenn die Zuordnung eines Speicherblocks aufgehoben wird, löscht das Betriebssystem nicht immer seinen Inhalt. Das bedeutet, dass die Daten des String-Literals immer noch im Speicher vorhanden sind, auch wenn sie technisch nicht erreichbar sind.
Undefiniertes Verhalten und Glück
Es ist wichtig zu beachten, dass dieses Verhalten undefiniert ist nach dem C-Standard. Das bedeutet, dass alles passieren kann, auch Abstürze oder falsche Ergebnisse. In einigen Fällen funktioniert es nicht aufgrund der richtigen C-Praktiken, sondern aufgrund der Implementierungsdetails des Betriebssystems.
Daher ist es wichtig, sich nicht auf dieses Verhalten zu verlassen und immer sicherzustellen, dass Daten in Ihrem C-Code korrekt zugeordnet und freigegeben werden .
Das obige ist der detaillierte Inhalt vonWarum funktioniert „c_str()' in diesem Fall bei einem freigegebenen „std::string'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!