Was ist ein Speicherhaufen?

173

Was ist ein Speicherhaufen?

H4cKL0rD
quelle

Antworten:

234

Vermutlich meinen Sie Heap aus Sicht der Speicherzuweisung, nicht aus Sicht der Datenstruktur (der Begriff hat mehrere Bedeutungen).

Eine sehr einfache Erklärung ist, dass der Heap der Teil des Speichers ist, in dem sich der dynamisch zugewiesene Speicher befindet (dh der über zugewiesene Speicher malloc). Der vom Heap zugewiesene Speicher bleibt so lange zugewiesen, bis einer der folgenden Ereignisse eintritt:

  1. Die Erinnerung ist free'd
  2. Das Programm wird beendet

Wenn alle Verweise auf den zugewiesenen Speicher verloren gehen (z. B. speichern Sie keinen Zeiger mehr darauf), liegt ein sogenannter Speicherverlust vor . Hier wurde der Speicher noch zugewiesen, aber Sie haben keine einfache Möglichkeit mehr, darauf zuzugreifen. Durchgesickerter Speicher kann nicht für zukünftige Speicherzuweisungen zurückgefordert werden, aber wenn das Programm endet, wird der Speicher vom Betriebssystem freigegeben.

Vergleichen Sie dies mit dem Stapelspeicher , in dem lokale Variablen (die innerhalb einer Methode definierten) leben. Der auf dem Stapel zugewiesene Speicher bleibt im Allgemeinen nur bis zur Rückkehr der Funktion erhalten (es gibt einige Ausnahmen, z. B. statische lokale Variablen).

Weitere Informationen zum Heap finden Sie in diesem Artikel .

LeopardSkinPillBoxHat
quelle
3
Wie könnten die lokalen Variablen in einem Stapel leben? Ein Stapel erlaubt es jeweils nur eine Variable in einer ganz bestimmten Reihenfolge zu nehmen. Was ist, wenn ich eine lokale Variable von irgendwo unten auf dem Stapel benötige?
CodyBugstein
9
@Imray - In einer statisch typisierten Sprache sind die Größen der lokalen Parameter zur Kompilierungszeit bekannt. Daher kann einfach über einen Adressoffset direkt vom Stapel auf die lokalen Variablen zugegriffen werden. Dazu muss der Stapel nicht geöffnet werden. Siehe diese Antwort für weitere Details.
LeopardSkinPillBoxHat
17

Ein Speicher - Heap eine Stelle im Speicher , wo Speicher können bei wahlfreiem Zugriff zugewiesen werden.
Im Gegensatz zu dem Stapel, in dem Speicher in einer genau definierten Reihenfolge zugewiesen und freigegeben wird, werden einzelne Datenelemente, die auf dem Heap zugewiesen sind, normalerweise auf asynchrone Weise freigegeben. Ein solches Datenelement wird freigegeben, wenn das Programm den entsprechenden Zeiger explizit freigibt, und dies kann zu einem fragmentierten Heap führen. Im Gegensatz dazu können nur Daten oben (oder unten, je nach Funktionsweise des Stapels) freigegeben werden, was dazu führt, dass Datenelemente in der umgekehrten Reihenfolge freigegeben werden, in der sie zugewiesen wurden.

mjv
quelle
9

Heap ist nur ein Bereich, in dem Speicher ohne Reihenfolge zugewiesen oder freigegeben wird. Dies geschieht, wenn man ein Objekt mit dem newOperator oder ähnlichem erstellt. Dies steht im Gegensatz zu einem Stapel, bei dem der Speicher auf der Basis des ersten und letzten Ausgangs freigegeben wird.

fastcodejava
quelle
8

Ein Speicherhaufen ist eine übliche Struktur zum Halten von dynamisch zugewiesenem Speicher. Siehe Dynamic_memory_allocation auf Wikipedia.

Es gibt andere Strukturen wie Pools, Stapel und Stapel.

Justicle
quelle
7

Dies ist ein Teil des Speichers, der vom Speichermanager, der von einem Prozess verwendet wird, vom Betriebssystem zugewiesen wird. Aufrufe an malloc()ua nehmen dann Speicher von diesem Heap, anstatt sich direkt mit dem Betriebssystem befassen zu müssen.

Ignacio Vazquez-Abrams
quelle
7

Sie meinen wahrscheinlich Heap-Speicher, nicht Speicher-Heap.

Der Heap-Speicher ist im Wesentlichen ein großer Speicherpool (normalerweise pro Prozess), von dem das laufende Programm Chunks anfordern kann. Dies wird normalerweise als dynamische Zuordnung bezeichnet .

Es unterscheidet sich vom Stapel, in dem "automatische Variablen" zugewiesen werden. Wenn Sie beispielsweise in einer C-Funktion eine Zeigervariable definieren, wird auf dem Stapel genügend Speicherplatz für eine Speicheradresse zugewiesen. Sie müssen jedoch häufig dynamisch Speicherplatz (mit malloc) auf dem Heap zuweisen und dann die Adresse angeben, an der dieser Speicherblock für den Zeiger beginnt.

Uri
quelle