Was ist mit dem schattierten Speichersegment passiert? Wie ich weiß, wird es bleiben, bis der Codeblock seine Ausführung beendet hat.
Wie pro §2.13.5/8 A Stringliteral hat statische Lagerdauer:
Ordinary Stringliterale und UTF-8-Zeichenketten werden auch als eng Stringliterale bezeichnet. Ein Narrow-String-Literal hat den Typ "array of n const char", wobei n die Größe der Zeichenfolge, wie unten definiert, und die statische Speicherdauer (3.7) hat.
was bedeutet, dass, wie pro §3.7.1/1, sie für die Dauer des Programms zuletzt:
Alle Variablen, die nicht über Gewinde Lagerdauer keine dynamische Lagerdauer haben und haben keine lokale Speicherdauer. Der Speicher für diese Einheiten muss für die Dauer des Programms (3.6.2, 3.6.3) ausreichen.
Als Randbemerkung, sollten Sie wirklich Stringliterale zu char const*
oder char const[]
, nicht zu char*
zuweisen. Der Grund, warum es meistens in Compilern funktioniert, ist aus Gründen der Abwärtskompatibilität und in C++ 11 ist es veraltet.
Kann diese garbaged Speichersegmente wieder für die Programmausführung wiederverwendet werden?
Nach §2.13.5/16 es ist nicht spezifiziert, ob sie wiederverwendet werden oder nicht:
ein String-Literal Ergebnisse in einem Stringliteral Objekt mit statischer Speicherdauer auswerten, aus dem gegebenen Zeichen initialisiert wie oben angegeben. Ob alle String-Literale unterschiedlich sind (dh in nicht überlappenden Objekten gespeichert sind) und ob aufeinanderfolgende Auswertungen eines String-Literals dasselbe oder ein anderes Objekt ergeben, ist nicht spezifiziert. [Hinweis: Der Versuch, ein Zeichenfolgenliteral zu ändern, ist nicht definiert. - Endnote]
String-Literale haben statische Speicherdauer, so dass es bis zum Ende des Programms bleibt. Wenn Sie eine andere Zeile 'p =" String "haben;' irgendwo kann es auf dasselbe Literal zeigen oder auch nicht –