EMZETT.
Login

Stack und Heap

Kurz: Stack und Heap sind die beiden Speicherbereiche eines Programms: Der Stack verwaltet Funktionsaufrufe und lokale Variablen automatisch und schnell, der Heap dynamisch angeforderte Daten mit flexibler Lebensdauer.

Genauer: Beim Aufruf einer Funktion legt das Programm auf dem Stack einen Rahmen (Stack Frame) mit Parametern, lokalen Variablen und Rücksprungadresse an; beim Verlassen wird er automatisch entfernt. Daten, die länger leben sollen oder deren Größe erst zur Laufzeit feststeht, liegen auf dem Heap – dort verwaltet sie der Programmierer (C/C++) oder ein Garbage Collector.

Stack und Heap im Speicher

Im Detail

StackHeap
Verwaltungautomatisch (LIFO, siehe Stack-Datenstruktur)manuell oder per Garbage Collector
Geschwindigkeitsehr schnelllangsamer
Größeklein (z. B. 1–8 MB)groß (Arbeitsspeicher)
Lebensdauerbis zum Ende der Funktionbis zur Freigabe
FehlerbildStack OverflowSpeicherlecks, Fragmentierung
void beispiel(void) {
    int a = 5;                         // Stack: verschwindet am Ende der Funktion
    int *b = malloc(sizeof(int));      // Heap: bleibt, bis free(b) aufgerufen wird
    *b = 7;
    free(b);
}
void methode() {
    int zahl = 5;                      // lokale Variable: Stack
    String s = new String("Text");     // Referenz auf dem Stack, Objekt auf dem Heap
}

Stack Overflow

Eine Funktion, die sich ohne Ende selbst aufruft (Rekursion ohne Abbruchbedingung), füllt den Stack, bis das Programm mit einem Stack Overflow abbricht.

def endlos(n):
    return endlos(n + 1)
 
endlos(0)    # RecursionError: maximum recursion depth exceeded

In höheren Sprachen

In Python, JavaScript oder Java liegen praktisch alle Objekte auf dem Heap; auf dem Stack liegen Referenzen und kleine Werte. In Rust und C++ entscheidet der Typ und die Schreibweise (Box, new). Compiler können Objekte per Escape-Analyse trotzdem auf den Stack legen.

Siehe auch: Stack, Zeiger, Garbage Collector, Speicherleck