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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top