Hi Thomas 
Ein Stack wird zum Anlegen lokaler Variablen benutzt. Du brauchst dich um seine Verwaltung nicht zu kümmern, denn lokale Variablen werden automatisch zerstört, wenn man die Funktion verlässt, in der sie definiert wurden. In C/C++ gibt es für solche Objekte eigentlich das Schlüsselwort auto , was aber stets weggelassen wird.
Ein Heap ist ebenfalls ein Speicherbereich zum Anlegen von Objekten. Jedoch werden hier die Objekte nicht automatisch (wie beim Stack) angelegt und zerstört, sondern das musst du mit new/delete bzw. malloc/free selber machen. Der Vorteil des Heaps ist, dass dort reservierte Speicherbereiche auch nach Beendigung der Funktion, in der sie definiert wurden, weiter existieren. Daher ist es wichtig, dass du als Programmierer diese reservierten Speicherbereiche auch wieder schön freigibst.
Du kannst dir das in etwa so vorstellen: Einer Anwendung (einem Prozess) steht ein gewisser Speicherplatz zur Verfügung. Dieser unterteilt sich in folgende Bereiche:
(1) einen Bereich für den auzuführenden Code selbst,
(2) einen Bereich für alle verwendeten Konstanten
(3) einen Bereich für alle globalen und statischen Variablen
(4) einen Stack
(5) und einen Heap.
(1) bis (3) haben eine fest definierte Größe. Der Stack (4) wächst von unten nach oben, der Heap (5) wächst von oben nach unten. Wenn die beiden zusammentreffen, gibt’s einen „out of memory error“. Also solltest du den Heap immer schön sauber halten
))
In Wirklichkeit ist es ein wenig komplizierter, weil eine Prozess mehrere Threads enthalten kann, die sich dann alle Bereiche bis auf den Stack teilen. Aber das würde jetzt zu weit führen …
cu Stefan.