PDA

View Full Version : Temporärer Speicher nach free()



schatte
06-07-12, 11:08
Hallo zusammen,

in einem Job wird ein C-Programm aufgerufen, welches mit malloc() und free() dynamischen Speicher reserviert und wieder vollständig freigibt.

Nach Aufruf von malloc() erhöht sich der Wert "Benutzter temporärer Speicher" um den entsprechenden Wert. Nach Aufruf von free() sinkt dieser Wert jedoch nicht. An dieser Stelle findet kein Aktivierungsgruppenwechsel statt.

Wie kann man nun prüfen, wieviel Speicher tatsächlich von diesem Job verwendet wird? Und wird der eigentlich freigegebene Speicher (durch free()) von anderen Jobs verwendet, wenn diese mehr Speicher benötigen?

Gruß
Matthias

Fuerchau
06-07-12, 11:48
In C/C++ läuft das ein wenig anders:

malloc() legt intern verwaltete Speicherblöcke an und fordert neuen Speicher, wenn alles belegt ist oder eben nicht ausreicht.

free() gibt nur den Speicherblock frei, und trägt ihn in eine Kette der freien Blöcke ein, kann aber den Speicher nicht physisch freigeben.

Der nächste malloc() / realloc() sucht den nächsten freien passenden Block und belegt diesen dann, wenn nichts groß genug, wird eben neuer Speicher angefordert.

Der Speicher wird insgesamt erst freigegeben, wenn das Programm tatsächlich aus der Aktivierungsgruppe entfernt wird (ähnlich *INLR=*ON).

Je nach Implementation gibt es hier halt die berühmten Memory-Leaks, da durch ständiges malloc()/free() der Speicher stark fragmentiert werden kann.

schatte
06-07-12, 15:05
Vielen Dank für deine Antwort.

Pikachu
06-07-12, 16:59
In C/C++ läuft das tatsächlich anders. Da passen doch beliebig viele Zeichen in ein 10stelliges Feld rein (Pufferüberlauf). Wer braucht da noch ein malloc()? :D

Fuerchau
06-07-12, 19:25
In C ja, in C++ normalerweise nicht, da z.B. Strings in einer Klasse gekapselt sind und malloc() überflüssig macht.

Es wird aber auch gerne gemischt, wenn man nicht rein objektorientiert arbeitet.

Stichwort: Codeinjection (Virale Infekte).

Übrigens: %alloc() und co. arbeiten ganz genauso und sind geführlicher als C++, da man beliebige Stukturen "based" deklarieren kann und beim verpointern ganz schnell was falsches verwendet wird.