2010-02-25 5 views
8

Diese Frage wurde mir in einem Interview gestellt.Was passiert, wenn versucht wird, Speicher freizugeben, der vom Heap-Manager zugewiesen wurde, der mehr zuweist als verlangt?

Angenommen char * p = malloc (n) weist mehr als n zu, sagen wir, dass N Bytes Speicher zugewiesen sind und free (p) wird verwendet, um den Speicher von p freizugeben.

kann Heap-Manager eine solche fehlerhafte Zuordnung durchführen? Was passiert jetzt, werden n Bytes freigegeben oder N Bytes freigegeben?

Gibt es eine Methode, um zu ermitteln, wie viel Speicher freigegeben wird?

EDIT

ist es eine Methode zu finden, wie viel Speicher frei ist?

besser als nichts,

mallinfo() kann etwas Licht wie spitz von "Fred Larson"

+6

Warum denken Sie, dass eine solche Zuordnung fehlerhaft ist? Unabhängig davon, wie viele "tatsächliche" Bytes "malloc()" zugewiesen sind, können Sie nur 'n' Bytes verwenden und' free() 'wird alle zugewiesenen Bytes freigeben. Die meisten "malloc" -Implementierungen weisen mehr Speicherplatz zu, als aus Effizienzgründen angefordert werden. Eine Implementierung definiert "malloc" und "free" und muss definitionsgemäß ein Zuteilungsschema vereinbaren. –

Antwort

8

Ja, das passiert fast jedes Mal, wenn Sie eine malloc(). Der Blockkopf malloc enthält Informationen über die Größe des Blocks, und wenn free() aufgerufen wird, gibt es diesen Betrag zurück an den Heap. Es ist nicht fehlerhaft, es wird Operation erwartet.

Eine einfache Implementierung könnte beispielsweise nur die Größe des Blocks in dem Raum speichern, der dem zurückgegebenen Zeiger unmittelbar vorausgeht. Dann würde free() etwa wie folgt aussehen:

void free(void *ptr) 
{ 
    size_t *size = (size_t *)ptr - 1; 

    return_to_heap(ptr, *size); 
} 

Wo return_to_heap() hier verwendet wird, eine Funktion zu verstehen, das die eigentliche Arbeit macht von dem angegebenen Speicherblock auf den Heap für eine spätere Verwendung zurückkehrt.

+0

Gibt es eine Methode, um herauszufinden, wie viel Speicher freigegeben wird? – Rozuur

+0

@rozuur: Der gesamte von 'malloc()' zugewiesene Speicher wird von 'free()' freigegeben. Ich denke, Ihre wahre Frage ist, wie Sie herausfinden, wie viel Speicher zugewiesen wurde. (Und die Antwort? Mindestens so viel wie angefordert wurde, wenn die Zuweisung erfolgreich war.) – Bill

+1

rozuur: siehe diese Seite: http://msdn.microsoft.com/en-us/library/ms220938(VS.80) .aspx es gibt eine Idee darüber, was tatsächlich getan wird, wenn Sie nach einem Stück Speicher fragen. Die meisten Implementierungen sind dem sehr ähnlich. – ThePosey

4

Ja, der Heap-Manager erlaubt einen Block von mehr als n Bytes zurückzukehren. Es ist absolut sicher (und erforderlich!), Den zurückgegebenen Zeiger unter Verwendung von free freizugeben, und free wird die gesamte Zuweisung freigeben.

Viele Heap-Implementierungen verfolgen ihre Zuordnungen, indem sie Metadatenblöcke in den Heap einfügen. free sucht nach diesen Metadaten, um zu ermitteln, wie viel Speicher freigegeben werden soll. Dies ist jedoch implementierungsspezifisch, daher gibt es keine Möglichkeit zu wissen, wie viel Ihnen malloc gibt, und im Allgemeinen sollten Sie sich nicht darum kümmern.

1

Im Allgemeinen wird der Heap-Manager freigeben, was auch immer es zugewiesen hat. Es speichert diese Information irgendwo und schaut es an, wenn free() aufgerufen wird.

Ein Heap-Manager ist nicht "fehlerhaft", wenn er mehr Speicher zuweist, als angefordert wurde. Heap-Manager arbeiten häufig mit festen Blockgrößen und runden bei Erfüllung einer Anfrage die nächste geeignete Blockgröße ab. Die Aufgabe des Heap-Managers ist es, so effizient wie möglich zu arbeiten, und oft ergeben sich große Effizienzvorteile aus ein paar kleinen Ineffizienzen.

+0

"Oft ergeben sich große Effizienzen aus ein paar kleinen Ineffizienzen" Nettes Zitat 8 ^) – caseman

1

Dies ist das Standardverhalten von malloc. Es gibt NULL oder einen Zeiger auf einen Abschnitt des Speichers mindestens so lange zurück, wie Sie gefragt haben. Also ja, muss in der Lage sein, damit fertig zu werden, Speicher länger loszuwerden, als gefragt wurde.

Das Herausfinden, wie viel Speicher tatsächlich frei war oder zugeteilt wurde, ist eine plattformspezifische Frage.

1

Andere Antworten haben gut erklärt, wie die Blockgröße gehandhabt wird. Um herauszufinden, wie viel Speicher frei ist, ist die einzige Lösung, die ich mir vorstellen kann, die Nummer mallinfo() vor und nach der Freischaltung.

Verwandte Themen