Speicherverbrauch mit Zeigern

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?

%Vor%

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

    
Deadlock 08.10.2015, 10:07
quelle

3 Antworten

6
  

Was ist mit dem schattierten Speichersegment passiert? Wie ich weiß, wird es bleiben, bis der Code-Block seine Ausführung beendet hat.

Gemäß §2.13.5 / 8 hat ein String-Literal eine statische Speicherdauer:

  

Gewöhnliche Zeichenfolgenliterale und UTF-8-Zeichenfolgenliterale werden auch als Zeichenfolgenliterale 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 sie gemäß §3.7.1 / 1 für die Dauer des Programms andauern:

  

Alle Variablen, die keine dynamische Speicherdauer haben, keine Threadspeicherdauer haben und nicht lokal sind, haben eine statische Speicherdauer. Der Speicher für diese Entitäten muss für die Dauer des Programms (3.6.2, 3.6.3) ausreichen.

Als Randnotiz sollten Sie String-Literalen wirklich char const* oder char const[] zuweisen, nicht char* . Der Grund, warum es meistens in Compilern funktioniert, ist aus Gründen der Abwärtskompatibilität und in C ++ 11 ist es veraltet.

  

Können diese aufgezeichneten Speichersegmente für die Programmausführung erneut verwendet werden?

Gemäß §2.13.5 / 16 ist nicht spezifiziert, ob sie wiederverwendet werden oder nicht:

  

Das Auswerten eines Zeichenfolgenliterals führt zu einem Zeichenfolgenliteralobjekt mit einer statischen Speicherdauer, die wie oben angegeben aus den angegebenen Zeichen initialisiert wird. Ob alle String-Literale verschieden 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]

    
Shoe 08.10.2015, 10:11
quelle
0

Dieses spezifische Speichersegment muss während der Ausführung des Programms nicht erneut verwendet werden. Diese Teile bleiben im Gedächtnis, bis das Programm zu Ende geht. Auch wenn Sie irgendwann den Befehl neu schreiben:

%Vor%

bedeutet nicht, dass p1 auf dieses bestimmte Speichersegment zeigt. Es kann, aber es darf nicht.

    
nikaltipar 08.10.2015 10:13
quelle
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.

    
Priyank Gupta 08.10.2015 10:13
quelle

Tags und Links