W C/C++, tak jak i w wielu innych językach, dane mogą być zapisywane w kilku odrębnych obszarach pamięci. Szczegóły zależą od implementacji, ale generalnie najważniejszymi takimi obszarami są stos i sterta.
Na stosie zapisywane są zmienne lokalne definiowane w programie (bez użycia operatora new). Gdy sterowanie wchodzi do funkcji (lub, ogólniej, bloku) zmienne utworzone w tej funkcji są umieszczane na stosie. Po wyjściu sterowania z tego bloku, stos jest „zwijany”: utworzone w nim zmienne są usuwane i stos powraca do stanu sprzed wejścia do funkcji/bloku. Zarządzanie stosem to bardzo delikatna sprawa i normalnie programista się tym nie zajmuje: „ręczna” ingerencja w strukturę stosu byłaby bardzo niebezpieczna. Nie ma zresztą żadnej potrzeby takiej ingerencji.
Drugi podstawowy obszar pamięci to sterta (ang. heap) lub, inaczej, obszar pamięci wolnej. Programista może alokować w tym obszarze miejsce na swoje dane, umieszczać je tam, następnie je zmieniać, odczytywać itd. W C/C++ dane te będą istnieć do końca działania programu i obszar pamięci wolnej, gdzie są zapisane, będzie zatem do końca programu oznaczony jako zajęty. Może to prowadzić do przepełnienia pamięci i przedwczesnego przerwania programu, albo jego znaczego spowolnienia (np. na skutek „swapowania”).
Jak wspomnieliśmy, nie ma w C/C++ automatycznego „odśmiecania” pamięci (choć istnieją implementacje posiadające tę cechę). Istnieją za to sposoby pozwalające „ręcznie” zwalniać zaalokowane wcześniej obszary pamięci wolnej (co w Javie jest praktycznie niemożliwe, ale też i mało potrzebne).
T.R. Werner, 21 lutego 2016; 20:17