Die 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 ein std::string-Objekt. Im folgenden Beispiel geben wir jedoch ein String-Literal im C-Stil von einer std::string-Funktion zurück:
std::string myFunction() {
return "it's me!!";
}
Dies gibt Anlass zur Sorge, da der hier implizit aufgerufene std::string-Konstruktor eine Kopie des String-Literals erstellt. 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 (irgendwie)
The Der Grund, warum dieser Code zu funktionieren scheint, liegt an einer Eigenart 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 .
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