Che cos'è un heap di memoria?


174

Che cos'è un heap di memoria?

Risposte:


234

Presumibilmente si intende heap dal punto di vista dell'allocazione della memoria, non dal punto di vista della struttura dei dati (il termine ha molteplici significati).

Una spiegazione molto semplice è che l' heap è la porzione di memoria in cui risiede la memoria allocata dinamicamente (ovvero la memoria allocata via malloc). La memoria allocata dall'heap rimarrà allocata fino a quando si verifica una delle seguenti condizioni:

  1. Il ricordo è free'd
  2. Il programma termina

Se si perdono tutti i riferimenti alla memoria allocata (ad es. Non si memorizza più un puntatore ad essa), si ha quella che viene chiamata perdita di memoria . Qui è dove la memoria è stata ancora allocata, ma non hai più modo di accedervi più. La memoria perduta non può essere recuperata per future allocazioni di memoria, ma quando il programma termina la memoria verrà liberata dal sistema operativo.

Contrastare questo con la memoria dello stack che è dove vivono le variabili locali (quelle definite all'interno di un metodo). La memoria allocata nello stack generalmente vive solo fino al ritorno della funzione (ci sono alcune eccezioni a ciò, ad esempio variabili locali statiche).

Puoi trovare ulteriori informazioni sull'heap in questo articolo .


3
Come potrebbero vivere le variabili locali in uno stack? Uno stack consente di prendere solo una variabile alla volta in un ordine molto specifico. E se avessi bisogno di una variabile locale da qualche parte in basso nello stack?
CodyBugstein,

9
@Imray: in una lingua tipizzata staticamente, le dimensioni dei parametri locali sono note al momento della compilazione. Pertanto è possibile accedere semplicemente alle variabili locali direttamente dallo stack tramite un offset di indirizzo. Non è necessario far apparire lo stack per farlo. Vedi questa risposta per maggiori dettagli.
LeopardSkinPillBoxHat

17

Un heap di memoria è una posizione nella memoria in cui la memoria può essere allocata ad accesso casuale.
A differenza dello stack in cui la memoria viene allocata e rilasciata in un ordine ben definito, i singoli elementi di dati allocati sull'heap vengono in genere rilasciati in modo asincrono l'uno dall'altro. Qualsiasi elemento di dati di questo tipo viene liberato quando il programma rilascia esplicitamente il puntatore corrispondente e ciò può provocare un heap frammentato. In opposizione, possono essere rilasciati solo i dati in alto (o in basso, a seconda del modo in cui funziona lo stack), con conseguente liberazione dell'elemento di dati nell'ordine inverso a quello assegnato.


9

L'heap è solo un'area in cui la memoria viene allocata o deallocata senza alcun ordine. Questo succede quando si crea un oggetto usando l' newoperatore o qualcosa di simile. Ciò si oppone allo stack in cui la memoria è allocata sulla prima in ultima uscita.


8

Un heap di memoria è una struttura comune per contenere la memoria allocata dinamicamente. Vedi Dynamic_memory_allocation su wikipedia.

Ci sono altre strutture, come piscine, pile e pile.


7

È un pezzo di memoria allocato dal sistema operativo dal gestore della memoria utilizzato da un processo. Le chiamate a malloc()et alia quindi prendono la memoria da questo heap invece di dover gestire direttamente il sistema operativo.


7

Probabilmente intendi memoria heap, non memoria heap.

La memoria heap è essenzialmente un grande pool di memoria (in genere per processo) da cui il programma in esecuzione può richiedere blocchi. In genere si parla di allocazione dinamica .

È diverso dallo Stack, dove sono allocate le "variabili automatiche". Pertanto, ad esempio, quando si definisce in una funzione C una variabile puntatore, nello stack viene allocato spazio sufficiente per contenere un indirizzo di memoria. Tuttavia, sarà spesso necessario allocare dinamicamente lo spazio (con malloc) sull'heap e quindi fornire l'indirizzo in cui questo blocco di memoria inizia al puntatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.