2010-06-21 6 views
6

Eventuali duplicati:
C programming : How does free know how much to free?In che modo la funzione free() raccoglie le informazioni sul no. di byte da liberare

free() è chiamato a deallocare la memoria allocata da malloc() chiamata di funzione. Da dove viene il free() trovare le informazioni sul no. di byte assegnati dalla funzione malloc(). Ad esempio, come si conforma il no. di byte allocati da malloc() e dove sono archiviate queste informazioni.

-Surya

+1

Sede [C di programmazione:? In che modo libero sapere quanto liberare] (http://stackoverflow.com/questions/1518711/c-programming-how-does-free-know-how-much- liberare) –

risposta

3

Questo dipende dall'implementazione. I negozi mucchio che i dati in qualche modo che facilita accedervi avere un puntatore restituito da malloc() - per esempio, il blocco può memorizzare il numero di byte all'inizio e malloc() restituirebbe un puntatore offsetted.

8

La maggior parte delle implementazioni di funzioni di allocazione di memoria C memorizza le informazioni contabili per ogni blocco, sia in linea o separatamente.

Un modo tipico (inline) è quello di allocare sia un'intestazione sia la memoria richiesta, riempita con dimensioni minime. Così, per esempio, se richiesto per 20 byte, il sistema può allocare un blocco di 48 byte:

intestazione
  • 16-byte contenente dimensioni, pennarello speciale, checksum, i puntatori ai successivo blocco precedente/e così via.
  • 32 byte di area dati (i 20 byte sono stati riempiti con un multiplo di 16).

L'indirizzo che ti è stato dato è l'indirizzo dell'area dati. Quindi, quando si libera il blocco, free prenderà semplicemente l'indirizzo che gli viene dato e, presumendo che non si sia riempito quell'indirizzo o la memoria circostante, controllare le informazioni contabili immediatamente prima di esso.

Tenere presente la dimensione dell'intestazione e il riempimento è totalmente definito dall'implementazione (in realtà, l'intero elemento è definito dall'implementazione a ma l'opzione di informazioni di contabilità interna è comune.

I checksum e i contrassegni speciali presenti nelle informazioni contabili sono spesso la causa di errori come "Memory arena corrotta" se si sovrascrivono. Il padding (per rendere l'allocazione più efficiente) è il motivo per cui a volte puoi scrivere un po 'oltre la fine dello spazio richiesto senza causare problemi (ancora, non farlo, è un comportamento indefinito e, solo perché funziona a volte, non lo fa t dire che va bene farlo).


un ho implementazioni di malloc scritto in sistemi embedded dove hai preso 128 byte, non importa quello che hai chiesto (che era la dimensione della più grande struttura nel sistema) e un semplice non-inline la maschera bit è stata utilizzata per decidere se un chunk da 128 byte è stato assegnato o meno.

Altri che ho sviluppato avevano pool diversi per blocchi da 16 byte, blocchi da 64 byte, blocchi da 256 byte e blocchi da 1K, ancora usando una maschera di bit per ridurre il sovraccarico delle informazioni contabili e aumentare la velocità di malloc e free (senza necessità di coalescenza blocchi liberi adiacenti), particolarmente importante nel contesto stavamo lavorando.

2

Quando si allocano un blocco di memoria, più byte di quanto richiesto trovi. Quanti dipende dall'implementazione, ma ecco un esempio:

struct MallocHeader { 
    struct MallocHeader * prev, * next; 
    size_t length; 
    ... more data, padding, etc ... 
    char data[0]; 
} 

Quando malloc() alloca la memoria dalla lista gratuita, allocherà size + sizeof(struct MallocHeader) e restituire l'indirizzo della data. In free(), l'offset di data nella struttura MallocHeader viene sottratto dal puntatore che si passa e quindi conosce la dimensione.

0

Questo dipende dall'implementazione, dipende dall'implementazione della libc e anche dall'implementazione del sistema operativo (più sull'implementazione del sistema operativo).

Non ho bisogno di sapere cose del genere ma se proprio lo vuoi puoi creare il tuo memory allocator.

Per errore ho scoperto che in C++ nell'assegnazione con nuovi [] operatore memorizza il numero di elementi, all'inizio della zona assegnata ritorno all'utente zona dopo il numero di elementi (On Visual Studio).

new[NUMBER] ---> [NUMBER (4bytes)]+[allocated area] 
it returns the pointer to the allocated area 
and probably when the delete[] operator is called 
it looks 4 bytes before the [allocated area] to see 
how much elements will be deleted 
Problemi correlati