2015-10-08 19 views
8

Bitte sehen Sie sich das Bild unten an. Nachdem der Wert von p1 geändert wurde, zeigt er nun auf den B2-Speicherort. Was ist mit dem schattierten Speichersegment passiert? Wie ich weiß, wird es bleiben, bis der Codeblock seine Ausführung beendet hat. Können diese Speichersegmente für die Programmausführung wiederverwendet werden?Speicherverbrauch mit Zeigern

char *p1 = "String"; 
char *p2 = "Another"; 
p1 = p2; 

Fragetitel kann irreführend sein. Ich konnte keinen passenden Titel für diese Frage finden.

+2

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 –

Antwort

6

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]

0

Dieses spezielle Speichersegment muss während der Programmausführung nicht erneut verwendet werden. Diese Teile bleiben im Gedächtnis, bis das Programm zu Ende geht. Auch wenn an einem gewissen Punkt, können Sie den Befehl neu schreiben:

p1 = "String"; 

es bedeutet nicht, dass p1 auf dieses speziellen Speichersegment verweisen. Es kann, aber vielleicht auch nicht.

0

Es bleibt im Speicher hängen, solange es nicht vom System gelöscht wird."Dangling", weil es keinen Zeiger gibt, der auf diese Zeichenfolge zeigt.