2010-02-25 10 views
8

Questa domanda mi è stata posta in un'intervista.cosa succede quando proviamo a liberare memoria allocata dal gestore di heap, che assegna più di quanto richiesto?

Supponiamo che char * p = malloc (n) assegni più di n, diciamo che N byte di memoria sono allocati e liberi (p) è usato per liberare la memoria allocata a p.

il gestore di heap può eseguire tale allocazione errata? cosa succede ora, n byte saranno liberati o N byte liberati?

esiste un metodo per trovare la quantità di memoria libera?

EDIT

c'è qualche metodo per trovare la quantità di memoria liberata?

meglio di niente,

mallinfo() può fare luce come rilevato da "Fred Larson"

+6

Perché pensi che una simile allocazione sia difettosa? Indipendentemente dal numero di "effettivi" byte 'malloc()' allocati, è possibile utilizzare solo 'n' byte e' free() 'libererà tutti i byte allocati. La maggior parte delle implementazioni di 'malloc' allocano più spazio quindi richiesto per motivi di efficienza. Un'implementazione definisce 'malloc' e' free' e, per definizione, devono concordare uno schema di allocazione. –

risposta

8

Sì, questo è quello che succede quasi ogni volta che si a malloc(). L'intestazione del blocco malloc contiene informazioni sulla dimensione del blocco e quando viene chiamato free() restituisce tale importo all'heap. Non è difettoso, è previsto l'operazione.

Un'implementazione semplice potrebbe, ad esempio, memorizzare solo la dimensione del blocco nello spazio immediatamente precedente al puntatore restituito. Poi, free() sarebbe simile a questa:

void free(void *ptr) 
{ 
    size_t *size = (size_t *)ptr - 1; 

    return_to_heap(ptr, *size); 
} 

Dove return_to_heap() è qui utilizzato per indicare una funzione che fa il vero lavoro di restituzione del blocco di memoria specificata al mucchio per uso futuro.

+0

Esiste un metodo per scoprire quanta memoria viene liberata? – Rozuur

+0

@rozuur: Tutta la memoria allocata da 'malloc()' sarà liberata da 'free()'. Penso che la tua vera domanda sia come scoprire quanta memoria è stata allocata. (E la risposta? Almeno quanto richiesto, se l'allocazione ha avuto successo.) – Bill

+1

rozuur: guarda questa pagina: http://msdn.microsoft.com/en-us/library/ms220938(VS.80) .aspx dà un'idea di ciò che viene effettivamente fatto quando si chiede un pezzo di memoria. La maggior parte delle implementazioni sono molto simili a questo. – ThePosey

4

Sì, il gestore di heap è permesso di restituire un blocco superiore n byte. È completamente sicuro (e richiesto!) Di liberare il puntatore restituito utilizzando free e lo free ne consentirà l'allocazione completa.

Molte implementazioni di heap tengono traccia delle loro allocazioni inserendo blocchi di metadati nell'heap. free cercherà quei metadati per determinare la quantità di memoria da rilasciare. Questo è specifico per l'implementazione, quindi non c'è modo di sapere quanto ti ha dato malloc e, in generale, non dovresti preoccuparti.

1

Generalmente il gestore di heap libererà tutto ciò che è stato assegnato. Memorizza queste informazioni da qualche parte e cerca quando viene chiamato free().

Un gestore di heap non è "difettoso" se assegna più memoria di quella richiesta. I gestori di heap spesso lavorano con dimensioni di blocco fisse e raggiungono la dimensione di blocco appropriata successiva quando soddisfano una richiesta. Il compito dell'heap manager è quello di essere il più efficiente possibile e spesso le grandi efficienze derivano da alcune piccole inefficienze.

+0

"spesso grandi efficienze derivano da alcune piccole inefficienze" Bella citazione 8 ^) – caseman

1

Questo è il comportamento predefinito di malloc. Restituirà NULL o un puntatore a una sezione di memoria almeno fino a quella richiesta. Quindi sì libero deve essere in grado di gestire liberarsi della memoria più a lungo di quanto richiesto.

Scoprire quanta memoria era effettivamente libera o allocata è una domanda specifica per la piattaforma.

1

Altre risposte hanno spiegato bene come viene gestita la dimensione del blocco. Per scoprire quanta memoria viene liberata, l'unica soluzione a cui posso pensare è chiamare mallinfo() prima e dopo il libero.

Problemi correlati