2010-12-14 92 views
3

Possible en double:
C programming : How does free know how much to free?c question de la fonction libre()

Salut,

quand j'ai le code suivant:

void *ptr = malloc(100); // alloc 100 bytes 
// do sth 
free(ptr); 

comment le libre() fonction sait combien d'espace e doit être libéré?

merci!

-

ok j'ai trouvé d'autres questions demandant la même chose, s'il vous plaît près - désolé

+0

Je pense que ce genre de questions est demandé tellement * fois sur SO déjà. Donc, devrait avoir faq perhpas? – Nyan

Répondre

2

Il est dépendant de l'implémentation, mais généralement le système sous-jacent mas une carte d'adresses aux blocs et il connaît la taille de cette carte mémoire.

Voici le code rayé de la glibc qui montre essentiellement ce que je viens de dire.

void fREe(Void_t* mem) 
{ 
    arena *ar_ptr; 
    mchunkptr p; 
    if (__free_hook != NULL) { 
    (*__free_hook)(mem, NULL); 
    } 

    if (mem == 0)        /* free(0) has no effect */ 
    return; 

    p = mem2chunk(mem); 

    if (chunk_is_mmapped(p))      /* release mmapped memory. */ 
    { 
    munmap_chunk(p); 
    return; 
    } 

    ar_ptr = arena_for_ptr(p); 
    chunk_free(ar_ptr, p); 
    (void)mutex_unlock(&ar_ptr->mutex); 
} 
5

Ces informations sont généralement contenues dans une zone de mémoire gérée par la mise en œuvre malloc. Les informations précèdent souvent la mémoire réelle qui vous a été fournie par malloc, mais c'est un détail d'implémentation, et vous ne pouvez pas compter sur quoi que ce soit ici.

+1

Il n'y a vraiment pas de * implémentation * de malloc. Votre système d'exploitation fournit l'implémentation. –

+1

@Luca Matteis: Non, ce n'est généralement pas le cas. Cela fait partie de la bibliothèque d'exécution (libc sur unix, crt sous Windows, etc.) Voir par exemple l'implémentation 'malloc' de Doug Lea (http://g.oswego.edu/dl/html/malloc.html) et, bien sûr, http://en.wikipedia.org/wiki/Malloc (qui mentionne même la mise en œuvre de Doug Lea, donc je l'espère pas si loin des rails ... :-) – Dirk

+1

@Luca Matteis: Ce n'est pas vrai. 'malloc' est définitivement une fonction CRT. OS ne se soucie généralement pas de choses aussi mineures que la gestion des tas. Il alloue de la mémoire à l'application en termes de mémoire ** pages ** (mémoire virtuelle). Et cette mémoire à son tour est ** partitionnée ** dans l'application. – valdo