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:
Wer behält diese Informationen?
Wie werden diese Informationen gespeichert?
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!
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.
a
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
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.
a
. 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.
Tags und Links memory-leaks memory c++