2010-12-14 6 views
3

Mögliche Duplizieren:
C programming : How does free know how much to free?c free() Funktion Frage

Hallo,

wenn ich folgenden Code haben:

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

wie die freie tut() Funktion wissen, wie viel spac e muss befreit werden?

danke!

-

ok Ich habe andere Fragen fanden die gleichen fragen, bitte schließen - sorry

+0

Ich denke diese Art von Fragen wird so * viele * mal auf SO schon gestellt. Also sollte faq perhpas haben? – Nyan

Antwort

2

Es ist abhängig von der Implementierung, aber in der Regel das zugrundeliegende System mas Karte von Adressen zu den Blöcken und es kennt die Größe von dem Speicherkarte.

Hier ist der Striped-down-Code von glibc, der es zeigt, was ich gerade gesagt habe.

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

Diese Informationen werden in der Regel in einem gewissen Speicherbereich durch die malloc Implementierung verwaltet enthalten. Die Informationen gehen oft dem tatsächlichen Speicher voraus, den Sie von malloc erhalten haben, aber das ist ein Implementierungsdetail, und Sie können sich hier auf nichts verlassen.

+1

Es gibt wirklich keine * Implementierung * von malloc. Ihr Betriebssystem stellt die Implementierung bereit. –

+1

@Luca Matteis: Nein, normalerweise nicht. Es ist Teil der Laufzeit-Bibliothek (libc auf Unix, CRT auf Windows, etc.) Siehe zum Beispiel Doug Leas 'malloc' Implementierung (http://g.oswego.edu/dl/html/malloc.html) und, natürlich, http://en.wikipedia.org/wiki/Malloc (was sogar die Implementierung von Doug Lea erwähnt, also bin ich hoffentlich nicht so weit weg ... :-) – Dirk

+1

@Luca Matteis: Das ist nicht wahr. 'malloc' ist definitiv eine CRT-Funktion. OS kümmert sich normalerweise nicht um so kleine Dinge wie die Verwaltung von Heap. Es reserviert Speicher für die Anwendung in Bezug auf Speicher ** Seiten ** (auch als virtueller Speicher bezeichnet). Und dieser Speicher wiederum ist innerhalb der Anwendung ** partitioniert. – valdo