2010-12-01 7 views
3

Mögliche Duplizieren:
C programming : How does free know how much to free?Wie kann free() wissen, wie viel Speicher frei ist?

In diesem Snippet

void main() { 
void *p = malloc(300); 
printf("%d",sizeof(*p)); 
free(p); 
} 

Wie weiß kostenlos viel Speicher ist Freigabe von der void-Zeiger soll?

Ich stelle dar, wenn es eine interne Tabelle/Funktion ist, sollte es verfügbar sein Größen jeder Art von Objekten, um herauszufinden, während der Ausgang des printf ist 1

+0

meine schlechte, ich sollte wirklich ohne die Klammer gesucht haben :) –

Antwort

3

malloc und kostenlos tun, um ihre eigene verborgene Buchführung, so dass sie die richtige Sache zu tun.

Der Grund, warum sizeof() diese Accounting-Informationen nicht verwendet, ist, dass sizeof() ein Kompilierzeitoperator ist und die malloc/free-Informationen erst zur Laufzeit verfügbar sind.

0

Jede Implementierung von malloc verfügt über einen internen Daten Struktur, wie viele Blöcke es zugewiesen hat. free und malloc gehen Hand-in-Hand so frei, weiß genau, wo sie suchen.

Siehe this Wiki article on Free List für weitere Informationen

+0

"... von wie viele Blöcke es zugewiesen", der Speicherort jedes Blocks zugeordnet und der Größe jedes Blocks zugeordnet: so für jeden Block das wird freigegeben, es (die 'Heap-Implementierung') merkt sich, wie groß dieser Block war. – ChrisW

+0

Dieser Artikel sollte wirklich auf wikis malloc & free articles –

1

Diese Implementierung abhängig ist. In einigen Systemen, die ich gesehen habe, reserviert es einige Bytes vor den Zeiger mit Informationen über die Größe des reservierten Chunk, nächsten freien Steckplatz des Speichers usw. Wie für die sizeof(void), wird dies nicht angegeben.

3
+0

Bitte fügen Sie tatsächliche Informationen in Antworten, zusätzlich zu Links, die veralten können. – Darron

+0

Warum wurde das abgelehnt? Es ist genau richtig. –

+0

Es ist _highly_ unwahrscheinlich, dass die comp.lang.c FAQ wird veralten, bevor Stack Overflow tut ... –