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.
Im Detail
| Stack | Heap | |
|---|---|---|
| Verwaltung | automatisch (LIFO, siehe Stack-Datenstruktur) | manuell oder per Garbage Collector |
| Geschwindigkeit | sehr schnell | langsamer |
| Größe | klein (z. B. 1–8 MB) | groß (Arbeitsspeicher) |
| Lebensdauer | bis zum Ende der Funktion | bis zur Freigabe |
| Fehlerbild | Stack Overflow | Speicherlecks, 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 exceededIn 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