Was passiert, wenn versucht wird, den vom Heap-Manager zugewiesenen Speicher freizugeben, der mehr als angeforderte zuweist?

8

Diese Frage wurde mir in einem Interview gestellt.

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

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

Gibt es eine Methode, um herauszufinden, wie viel Speicher frei ist?

BEARBEITEN

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

besser als nichts,

mallinfo () kann etwas Licht abwerfen, wie es von "Fred Larson"

gezeigt wurde     
Rozuur 25.02.2010, 17:56
quelle

5 Antworten

8

Ja, das passiert fast jedes Mal, wenn du malloc() hast. Der Header malloc block enthält Informationen über die Größe des Blocks, und wenn free() aufgerufen wird, gibt er diesen Betrag an den Heap zurück. 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() in etwa so aussehen:

%Vor%

Dabei wird return_to_heap() verwendet, um eine Funktion zu bezeichnen, die die tatsächliche Arbeit des Zurückgebens des angegebenen Speicherblocks zur zukünftigen Verwendung an den Heap ausführt.

    
Carl Norum 25.02.2010, 17:59
quelle
4

Ja, der Heap-Manager darf einen Block von mehr als n Bytes zurückgeben. Es ist völlig sicher (und erforderlich!), Den zurückgegebenen Zeiger mit free freizugeben, und free wird all dies rückgängig machen.

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 malloc Ihnen gegeben hat, und generell sollten Sie sich nicht darum kümmern.

    
Nick Meyer 25.02.2010 17:59
quelle
1

Im Allgemeinen wird der Heap-Manager freigeben, was auch immer er zugewiesen hat. Es speichert diese Information irgendwo und schaut sie nach, 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.

    
Kristopher Johnson 25.02.2010 18:00
quelle
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.

Herauszufinden, wie viel Speicher tatsächlich frei oder zugewiesen war, ist eine plattformspezifische Frage.

    
JaredPar 25.02.2010 18:00
quelle
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, mallinfo() vor und nach dem free zu nennen.

    
Fred Larson 25.02.2010 18:17
quelle

Tags und Links