2009-12-26 8 views
14

Possible en double:
C programming : How does free know how much to free?Comment free() sait combien de mémoire libérer?

Lors de la programmation en C, j'utilise souvent malloc() pour allouer de la mémoire et free() à libérer:

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

Comment free() savoir la quantité de mémoire désaffecter? Est-ce que malloc() crée une table quelque part pour mémoriser les pointeurs et combien de mémoire chaque pointeur pointe-t-il?

Si tel est le cas, free() échouera-t-il si je renomme le pointeur? .: par exemple

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

Que se passerait-il si j'incrémenter le pointeur, puis exécutez free()? .: par exemple

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

Sera-t-désaffecter une partie de la mémoire supplémentaire juste à côté de la fin du tableau d'origine?

+3

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

Répondre

19

Le moyen le plus courant est qu'il stocke certaines informations immédiatement avant l'adresse qu'il vous renvoie. Donc, si malloc renvoie l'adresse 0x1004, en interne, malloc aura mis de côté la mémoire commencée à 0x0FFC et stockera diverses informations telles que la taille quelque part dans la mémoire entre 0xFFC - 0x1003 mais l'application sera informée que l'allocation commence à 0x1004. La seule chose qui compte, c'est d'obtenir exactement la même adresse que celle retournée par malloc.

Questions connexes