Heim  >  Artikel  >  Backend-Entwicklung  >  Warum funktioniert „c_str()“ in diesem Fall bei einem freigegebenen „std::string“?

Warum funktioniert „c_str()“ in diesem Fall bei einem freigegebenen „std::string“?

Barbara Streisand
Barbara StreisandOriginal
2024-10-26 16:24:30599Durchsuche

 Why Does `c_str()` Work on a Deallocated `std::string` in This Case?

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!

Stellungnahme:
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