C ++ - Speicherlecks: Wo wird die Zeiger- (Meta-) Information gespeichert?

8

Dies ist eine grundlegende Frage, auf die ich keine Antwort finden kann.

Mit dem nächsten Code wird ein Speicherverlust auftreten:

%Vor%

Sagen wir, dass a den Wert 1000 hat. Das heißt, die Adresse 1000 auf dem Heap wird jetzt von einem A-Objekt übernommen. Bei 1 ist a == 1000 und bei 2 a nicht im Bereich. Aber einige Informationen fehlen.

Im wirklichen Leben ist die Adresse 1000 die Adresse eines Bytes im Speicher. Dieses Byte hat nicht die Information, dass es eine wertvolle Information speichert.

Meine Fragen:

  1. Wer behält diese Informationen?

  2. Wie werden diese Informationen gespeichert?

  3. Welche Komponente "weiß" von wo zu wohin der Zeiger a zeigt? Wie kann der Computer wissen, dass ein Punkt auf sizeof (A) Bytes zeigt?

Danke!

    
Eyal 02.04.2011, 20:22
quelle

4 Antworten

3

In der Regel werden neue und Löschoperatoren auf Malloc und Free implementiert, obwohl dieses Detail nicht spezifiziert ist. malloc und free zeigen beide auf eine Datenstruktur, die verfolgt, welche Speicherbereiche zugeordnet sind, welche nicht und wie groß jede Region ist. Knuths Art of Computer Programming Vol. 1 hat eine ziemlich gute Beschreibung einiger Zuweiserdesigns.

    
Howard Hinnant 02.04.2011, 20:50
quelle
6
  1. Diese Information wird in Ihrem Programm in der Variable a
  2. gespeichert
  3. Der Compiler weiß dies während des Kompilierens. Laufzeit nur der Zuordner weiß, dass "an dieser bestimmten Adresse sizeof(A) Bytes reserviert sind" - und Sie können diese Informationen nicht verwenden, es wird einfach erwartet, dass Sie diese Bytes so behandeln, als enthielten sie ein A
Erik 02.04.2011 20:29
quelle
4

Der Sprachstandard sagt nicht.

Alles was wir wissen ist, dass wenn wir delete a machen, der Speicher wieder freigegeben wird.

Es gibt mehrere Optionen, wie z. B. das Zuordnen von allem, was die Größe von (a) von einem bestimmten Speicherpool mit den Adressen 1000 bis 1000 + x ist. Oder jemand (die Sprachlaufzeit oder das Betriebssystem) kann irgendwo bei Tisch bleiben. Oder etwas anderes.

    
Bo Persson 02.04.2011 20:28
quelle
0
  1. Die Speicheradresse wird in der Variablen a .
  2. gespeichert
  3. Es wird einfach als Wert auf dem Stapel gespeichert wie jede andere lokale Variable. Nur eine einfache alte Nummer, die auf einen Speicherort verweist, der ein A-Objekt speichert.
  4. Der Compiler weiß, dass der Typ von a A* ist. So weiß es, dass das Objekt an der Stelle, die in a gehalten wird, ein A-Objekt sein sollte. Deshalb haben Sie Probleme, wenn Sie andere Objekte an diesem Ort haben. Der generierte Maschinencode verhält sich so, als ob ein A-Objekt vorhanden wäre. Wenn nicht, gibt es eine abgeleitete Klasse, dann muss sie erstellt werden, um sie überleben zu können (virtuelle Funktionstabellen im Falle einer abgeleiteten Klasse) Klasse).

Sobald ein lokaler Zeiger den Gültigkeitsbereich verlässt, wird er vom Stapel genommen. Wenn dies der einzige Zeiger auf das Objekt auf dem Heap war, haben Sie keine Möglichkeit mehr, es zu löschen. Deshalb bekommen Sie ein Speicherleck. Plötzlich hast du keine Ahnung mehr, wo das Objekt ist, weil du deinen einzigen Zeiger verloren hast.

    
Joseph Mansfield 02.04.2011 21:49
quelle

Tags und Links