tommireds ha scritto:
Ma cos'è sto benedetto heap?
aiiiii... andiamo proprio male, nel senso che dovrai approfondire parecchio l'argomento.
in due parole (troverai mille spiegazioni più approfondite) un programma funziona con due aree di memoria (... oddio... se qualche mio collega legge mi ritirano la laurea per dargli fuoco ).
Una si chiama stack, e viene normalmente "manipolata" dalle funzioni. Le variabili che definisci nelle funzioni vengono materialmente allocate lì, sullo stack (insieme ai parametri delle funzioni stesse)
Dentro lo stack, ad ogni chiamata di funzione, viene "impilato" un "pacchettone" che comprende le variabili locali, i parametri (e tante altre belle cose).
Quando una funzione termina, il "pacchettone" viene buttato via, liberando la memoria occupata dallo stack.
Esso, pertanto, aumenta e diminuisce dinamicamente man mano che le varie funzioni vengono chiamate e "lavorano".
Avendo questa particolarità, di essere creato e distrutto, i dati presenti lì sopra sono però volatili, nel senso che il risultato delle computazioni "sparisce" ogni volta.
Qualora volessi mantenere delle informazioni di tipo "statico" (non far confusione con lo static del C), cioè che sono "immortali", allora dovrai allocarle da un'altra parte.
Dove? Sullo heap.
Cos'è? un'area di memoria dove il programma esplicitamente si "ritaglia" pezzi di memoria, per mantenere informazioni che vanno serbate e non distrutte ogni volta.
Come ci si ritaglia un pezzo di heap? Ad esempio con malloc() (e le varie funzioni cugine).
Dirò quindi "caro sistema operativo, a me serve un pezzo di memoria diciamo da 1000 byte, per farci quello che mi pare e piace".
Il programma farà una malloc di 1000 byte, e se va tutto bene "qualcuno" (non chiariamo chi) dirà:
caro programma, iniziando dalla locazione di memoria 3734263623 ci sono i tuoi 1000 byte. fanne buon uso.
per inciso, dal momento che questa memoria è "highlander", cioè "immortale", dovrà essere IL TUO programma a dire, prima o poi
grazie, non mi serve più il blocco di memoria che parte da 3734263623 per i successivi 1000 byte