Le memorie sono dispositivi che permettono la memorizzazione di informazioni, sotto forma binaria; le informazioni possono essere dati, le istruzioni di un programma, i risultati intermedi e finali di operazioni.

L'area di memoria stack (pila) è caratterizzata dalla proprietà che l'ultimo dato che entra in memoria nella fase di scrittura è il primo ad uscire nella fase di lettura; per tale motivo è detta anche LIFO, dalle iniziali di Last In First Out. Il pacchetto di dati viene allocato in memoria non appena l'esecuzione passa dal programma chiamante a una funzione. Questo pacchetto, il quale contiene l'indirizzo di rientro nel programma chiamante e la lista degli argomenti passati alla funzione, viene impilato sopra il pacchetto precedente (quello del programma chiamante) e poi automaticamente rimosso dalla memoria appena l'esecuzione della funzione é terminata.

Grazie a questo meccanismo le funzioni possono essere chiamate ricorsivamente e inoltre si possono gestire funzioni con numero variabile di argomenti.

In realtà nella memoria stack vengono sistemate anche altre informazioni, e precisamente i dati relativi a tutte le variabili automatiche (cioè locali e non statiche) create dalla funzione. Il loro tempo di vita è legato all'esecuzione della funzione proprio perché, quando la funzione termina, l'intera area stack allocata viene rimossa.

Esiste un'altra area di memoria che il programma può utilizzare. Questa area, detta heap, è soggetta a regole di visibilità e tempo di vita completamente diverse da quelle che governano l'area stack e precisamente:

  • l'area heap non è allocata automaticamente, ma può essere allocata o rimossa solo su esplicita richiesta del programma (allocazione dinamica della memoria);
  • l'area allocata non è identificata da un nome, ma è accessibile esclusivamente tramite la definizione di un puntatore;
  • la sua visibilità è legata a quella della variabile puntatore che contiene il suo indirizzo;
  • il suo tempo di vita coincide con l'intera durata del programma, a meno che non venga esplicitamente deallocata; se il puntatore va in una particolare condizione, denominata out of scope, l'area non è più accessibile, ma continua a occupare memoria inutilmente.

In C++ la memoria può essere allocata dinamicamente tramite l'operatore new e deallocata tramite l'operatore delete.