2009-12-26 10 views
14

Duplicar posible:
C programming : How does free know how much to free?¿Cómo sabe free() cuánta memoria desasignar?

Al programar en C, a menudo uso malloc() asignar memoria y free() para liberarlo:

MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects); 
/** Do stuff **/ 
free(objArr); 

¿Cómo free() saber la cantidad de memoria desasignar? ¿malloc() crea una tabla en algún lugar para recordar punteros y cuánta memoria apuntaba cada puntero?

Si ese es el caso, se free() fallar si puedo cambiar el nombre del puntero? ej .:

MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects); 
MyObject* newPtr= objArr; 
free(newPtr); /** Does this fail? **/ 

¿Qué pasará si el puntero de la subasta y después ejecutar free()? ej .:

MyObject* objArr= (MyObject*) malloc(sizeof(MyObject)*numberOfObjects); 
newPtr++; 
free(newPtr); /** What happens now? **/ 

Va a cancelar la asignación de una porción adicional de memoria junto a la final de la matriz original?

+3

Duplicado de http://stackoverflow.com/questions/1518711/c-programming-how-does-free-know-how-much-to-free – codaddict

Respuesta

19

La forma más común es que almacena cierta información inmediatamente antes de la dirección se vuelve a ti. Así que si malloc devuelve la dirección 0x1004, internamente, malloc habrá puesto a un lado la memoria comenzó a las 0x0FFC y almacenará información variada, como el tamaño en algún lugar de la memoria entre 0xFFC - 0x1003 pero la aplicación se le dirá la asignación comienza en 0x1004.

La única cosa que importa para liberar está recibiendo la misma dirección exacta como lo volvió malloc.

Cuestiones relacionadas