Consideriamo questo brevissimo frammento di codice:Posso supporre che chiamare realloc con una dimensione più piccola libererà il resto?
#include <stdlib.h>
int main()
{
char* a = malloc(20000);
char* b = realloc(a, 5);
free(b);
return 0;
}
Dopo aver letto la pagina man di realloc, non ero del tutto sicuro che la seconda riga causerebbe le 19995 byte in più per essere liberati. Per citare la pagina man: The realloc() function changes the size of the memory block pointed to by ptr to size bytes.
, ma da quella definizione, posso essere sicuro che il resto verrà liberato?
Voglio dire, il blocco puntato da b
contiene certamente 5 byte liberi, quindi sarebbe sufficiente per un allocatore pigro che non fa semplicemente nulla per la linea realloc?
Nota: L'allocatore che uso sembra liberare i 19 995 byte in più, come dimostrato da valgrind quando commentando la linea free(b)
:
==4457== HEAP SUMMARY:
==4457== in use at exit: 5 bytes in 1 blocks
==4457== total heap usage: 2 allocs, 1 frees, 20,005 bytes allocated
L'intestazione '' non è definita dallo standard: preferisce usare ''. Anche il cast del valore restituito da 'malloc' (o' realloc') non ha scopo utile e può nascondere un errore (* rappresentazione di 'void *' e 'int' che sono diversi *) il compilatore avrebbe preso altrimenti. –
pmg
["La dimensione del blocco di memoria indicata dal parametro ptr viene modificata in byte di dimensione, espandendo o riducendo la quantità di memoria disponibile nel blocco."] (Http://www.cplusplus.com/reference/clibrary/cstdlib/realloc /) –
@pmg ok Non lo sapevo. Cambierò nel mio snippet – qdii