Allozierten Speicherbereich freigeben

Hi,

neulich habe ich gelesen, dass allozierte Speicher, der wieder freigegeben wurde, nicht vom laufendem Programm wieder belegt werden kann. Stimmt das? Wenn dem so ist, muessten doch andere Prozesse diesen Bereich belegen koennen. Warum kann der Prozess, der den Speicher angefodert hat, diesen Bereich nicht wieder nutzen?

Li

Hallo Li,

neulich habe ich gelesen, dass allozierte Speicher, der wieder
freigegeben wurde, nicht vom laufendem Programm wieder belegt
werden kann. Stimmt das? Wenn dem so ist, muessten doch andere
Prozesse diesen Bereich belegen koennen. Warum kann der
Prozess, der den Speicher angefodert hat, diesen Bereich nicht
wieder nutzen?

Vermutlich hast du da etwas falsch verstanden.
Nehmen wird mal die Funktionen
alloc() welche einen Zeiger auf einen Speicherbereich zurückgiebt
und
free() mit welcher dieser Block wieder zurückgegeben wird.

Und jetzt ein kleines Programm:

Zeiger = alloc(100);
// alloc() bewirkt, dass dir ein Speicherblock von
// 100 Bytes durch die SPeicherverwaltung zugeteilt wird.
// Die Adresse dieses Blocks wird in „Zeiger“ abgelegt.
// Damit kannst du jetzt machen was du willst
free(Zeiger);
// Mit free() jetzt gehört der Speicherbloch wieder
// der Speicherverwaltung und es kann sein, dass dieser
// Block an einen anderen Task weitervergeben wird.
// Wenn du ab diesem Punkt über „Zeiger“ auf den Block
// zugreifst kann es zur Katastrofe kommen !!!
Zeiger = alloc(100);
// Es kann sein, dass du jetzt wieder den gleichen
// Speicherblock bekommst, muss aber nicht !!!

Die Regel ist folgende:
Nach dem Aufruf von free() DARF der zurückgegeben Zeiger NICHT mehr verwendet werden !!

MfG Peter(TOO)

Vermutlich hast du da etwas falsch verstanden.
Nehmen wird mal die Funktionen
alloc() welche einen Zeiger auf einen Speicherbereich
zurückgiebt
und
free() mit welcher dieser Block wieder zurückgegeben wird.

Und jetzt ein kleines Programm:

Zeiger = alloc(100);
// alloc() bewirkt, dass dir ein Speicherblock von
// 100 Bytes durch die SPeicherverwaltung zugeteilt wird.

Einspruch: Mir werden in der Tat 100 Bytes zugeteilt, mehr auch nicht, aber aus dem Speicher ist eine Speicherseite weg. Je nach BS variiert die Groesse (i.d. R. 2kB bis 8kb).

free(Zeiger);
// Mit free() jetzt gehört der Speicherbloch wieder
// der Speicherverwaltung und es kann sein, dass dieser
// Block an einen anderen Task weitervergeben wird.
// Wenn du ab diesem Punkt über „Zeiger“ auf den Block
// zugreifst kann es zur Katastrofe kommen !!!

Naja, nicht gleich die Mega-Katastrophe, lediglich ein Speicherzugriffsfehler (page violation, segmentation fault), wobei der Prozess vom BS-Kern abgeschossen wird (Idealfall).

Die Regel ist folgende:
Nach dem Aufruf von free() DARF der zurückgegeben Zeiger NICHT
mehr verwendet werden !!

Laesst sich ja ausprobieren, wenn ich z.b. zeiger = alloc(BUFSIZ) ausfuehren lasse und die Adresse der ersten Speicerzelle ausgeben lasse, dann mit free() freigeben, Prozesswechel und andere speicherfressende Programme starten, waehrend mein urspruengliches Proggi 3 min. passiv wartet sleep(180), dann nochmal Speicher anfordern und anhand der Adresse herausfinden, obs wieder diesselbe ist. Versuch mach kluch.

Li

Hallo Li,

Zeiger = alloc(100);
// alloc() bewirkt, dass dir ein Speicherblock von
// 100 Bytes durch die SPeicherverwaltung zugeteilt wird.

Einspruch: Mir werden in der Tat 100 Bytes zugeteilt, mehr
auch nicht, aber aus dem Speicher ist eine Speicherseite weg.
Je nach BS variiert die Groesse (i.d. R. 2kB bis 8kb).

Das kommt eben sehr auf die CPU und das BS an. Nennt sich Granuralität. Ich habe kleine BS für uP’s geschrieben, da ist der Overhead nur mal gerade 4 Bytes.

free(Zeiger);
// Mit free() jetzt gehört der Speicherbloch wieder
// der Speicherverwaltung und es kann sein, dass dieser
// Block an einen anderen Task weitervergeben wird.
// Wenn du ab diesem Punkt über „Zeiger“ auf den Block
// zugreifst kann es zur Katastrofe kommen !!!

Naja, nicht gleich die Mega-Katastrophe, lediglich ein
Speicherzugriffsfehler (page violation, segmentation fault),
wobei der Prozess vom BS-Kern abgeschossen wird (Idealfall).

Das funktioniert aber eben nur wenn du eine CPU mit MMU (Memory Managment Unit) und ein BS welche diese auch verwendet. Wie schon erwähnt bei einem SingleChip uP hast du diesen Komfort meistens nicht und WIN 3.1 hat da auch nicht so schön reagiert.

Die Regel ist folgende:
Nach dem Aufruf von free() DARF der zurückgegeben Zeiger NICHT
mehr verwendet werden !!

Laesst sich ja ausprobieren, wenn ich z.b. zeiger =
alloc(BUFSIZ) ausfuehren lasse und die Adresse der ersten
Speicerzelle ausgeben lasse, dann mit free() freigeben,
Prozesswechel und andere speicherfressende Programme starten,
waehrend mein urspruengliches Proggi 3 min. passiv wartet
sleep(180), dann nochmal Speicher anfordern und anhand der
Adresse herausfinden, obs wieder diesselbe ist. Versuch mach
kluch.

Dann wirst du sicher eine andere Adresse bekommen, aber wenn im System dazwischen nichts passiert ist die Wahrscheinlichkeit grösser, das du wieder den gleichen Block bekommst. Aber das ist halt bei einem PC wie ein Sechser im Lotto.

MfG Peter(TOO)