ridimensionamento tampone con realloc
Domanda
Se l'area indicò è stato spostato, un gratuito (PTR) è fatto.
Si può spiegare la linea sopra circa realloc()
? Questa linea è da una pagina di manuale per calloc, malloc, realloc e gratuito.
Soluzione
Credo che questo lo spiega meglio:
Se lo spazio sufficiente non esiste per espandere il blocco corrente nella sua posizione corrente, un nuovo blocco della a parità di dimensioni viene allocata, e i dati esistenti vengono copiati dal vecchio bloccare l'inizio del nuovo bloccare. Il vecchio blocco viene liberato, e la funzione restituisce un puntatore alla nuova blocco.
Riferimento tratto da realloc in C
Altri suggerimenti
Diciamo che avere le seguenti layout heap. Si tratta di un allocatore di memoria semplificato in cui nessuno spazio è ripreso nel mucchio da informazioni di controllo
Addr A B
+------------+ +------------+
1000 | your space | | your space |
+------------+ +------------+
2000 | free space | | used space |
| | +------------+
3000 | | | free space |
| | | |
4000 | | | |
+------------+ +------------+
In entrambe le situazioni, si dispone di 1000 byte allocato all'indirizzo 1000. Tuttavia, in situazione B, questo è immediatamente seguito da memoria allocata per altri scopi.
Esaminiamo cosa succede quando si vuole riallocare la memoria a 2000 byte.
Nella situazione A, questo è facile, solo espande l'allocazione come da schema seguente.
Ma, in situazione di B, non è così facile. La memoria subito dopo il tuo blocco è in uso, quindi non c'è abbastanza spazio per espandere solo la tua allocazione, e necessità di memoria consecutivo. Ecco la posizione finale per le due situazioni:
Addr A B
+------------+ +------------+
1000 | your space | | free space |
| | +------------+
2000 | | | used space |
+------------+ +------------+
3000 | free space | | your space |
| | | |
4000 | | | |
+------------+ +------------+
Per la situazione B, l'allocatore trova un blocco (a 3000) che è abbastanza grande per la vostra espansione desiderata e copia il contenuto del vostro blocco corrente (al 1000) ad esso. Poi ti dà l'indirizzo di questo nuovo blocco e libera il vecchio blocco dal momento che non è più richiesto da voi. Questo è ciò che la frase nella tua domanda significa.
Questa azione di spostare buffer intorno dipende dalla strategia di allocazione di memoria, ma, in generale, un buffer non verrà spostato (spesso è costoso poiché comporta una copia della memoria di massa) se:
- non v'è spazio libero dopo che, insieme con lo spazio corrente, in grado di soddisfare la riallocazione; o
- si sta riducendo le dimensioni.
Non si può sempre e solo far crescere l'area di memoria in situ. Non ci può essere spazio nel mucchio. Così, invece di coltivarlo, che assegnerà un nuovo blocco di memoria e liberare la vecchia memoria.