Forum: PC-Programmierung Speicher nicht freigeben


von Gonzo (Gast)


Lesenswert?

hallo
wenn ich in c oder c++ speicher reserviere und nicht mehr freigebe was 
passiert dann?

von Mars (Gast)


Lesenswert?

Der Speicher bleibt reserviert, bis dein Programm endet.

von drusius (Gast)


Lesenswert?

Je nach BS auch darüber hinaus....

von Karl H. (kbuchegg)


Lesenswert?

Gonzo schrieb:
> hallo
> wenn ich in c oder c++ speicher reserviere und nicht mehr freigebe was
> passiert dann?

Wenn du das laufend machst, wird dein Programm irgendwann keinen 
Speicher mehr reservieren können und, je nachdem wie du das programmiert 
hast, einfach abstürzen oder die Festplatte formatieren oder sonst 
irgendetwas dämliches tun oder den Weltuntergang herbeiführen. Letzteres 
ist zwar unwahrscheinlich aber die Sprachdefinition würde es erlauben.

Wenn dein Programm endet, hängt es vom Betriebssystem ab ob es hinter 
dir aufräumt. Aber andere für sich aufräumen zu lassen ist genauso 
verpönt, wie 25-Jährige die das "Hotel Mama" aus purer Bequemlichkeit in 
Anspruch nehmen.

von P. S. (Gast)


Lesenswert?

Belegten Speicher wieder freigeben, wenn man ihn nicht mehr braucht ist 
ja kein Problem - wenn man sein Programm und die von ihm belegten 
Resourcen im Griff hat. Hat man das nicht, tut das Programm sowieso 
allenfalls zufaellig, was man will und man weiss also schon, woran man 
arbeiten sollte...

von Gonzo (Gast)


Lesenswert?

wenn ich zb mit visual studie programmiere unter vista (8Gb ram

dann kann ich doch normalerweise sovie speicher verplämbern wie ich will 
odeer

von Karl H. (kbuchegg)


Lesenswert?

Gonzo schrieb:
> wenn ich zb mit visual studie programmiere unter vista (8Gb ram
>
> dann kann ich doch normalerweise sovie speicher verplämbern wie ich will
> odeer

Ja, mach das mal.
Dein erster Anwender, der das Programm am laufen hat und nebenbei noch 
ein Word und ein Excel offen hat, wird dir dankbar sein, wenn bei einem 
Programmwechsel die Maschine erst mal 2 Minuten auf der Festplatte 
rumrödelt. Auf die Art kann er wenigstens einen akustischen Test machen, 
ob die Plattenlager demnächst den Geist aufgeben werden.

von Peter (Gast)


Lesenswert?

> wenn ich zb mit visual studie programmiere unter vista (8Gb ram)
In der Art wie du hier frage stellt, vermute ich mal das du 32bit 
Programme schreibst, und da ist bei 2GB schluss - mehr bekommt du nicht.

Ich hoffe du hast wenigsten ein 64bit Viste sonst hast du viel zu viel 
geld für den speicher ausgegeben.

von Gonzo (Gast)


Lesenswert?

sorry für die dummen fragen aber ich kann mir das halt nicht vorstellen
wie man zb mit  zeiger= new int[100] ; zb den Arbeitsspeicher vollkriegt

von Peter (Gast)


Lesenswert?

> zeiger= new int[100] ; zb den Arbeitsspeicher vollkriegt
man könnte

for( _int64 i = 0; i < 10000000000000ll; ++i ) {
   zeiger = new int[1000];
}

schreiben

oder entwas einfacher;

32bit:
malloc(2000000000);

64bit:
malloc(20000000000000000ll);

von Karl H. (kbuchegg)


Lesenswert?

Gonzo schrieb:
> sorry für die dummen fragen aber ich kann mir das halt nicht vorstellen
> wie man zb mit  zeiger= new int[100] ; zb den Arbeitsspeicher vollkriegt

Der Programmteil den du jetzt (schlampig) schreibst, könnte nächste 
Woche in einen Windows-Service eingebaut werden und läuft dann zb jede 
Minute einmal für Tage und Wochen. Aus deinen 100 nicht freigegebenen 
int werden so im Lauf der Zeit ein paar Millionen oder Milliarden. Und 
die fallen dann ins Gewicht!

von Gonzo (Gast)


Lesenswert?

geht nicht der pc bricht ab

von Sven P. (Gast)


Lesenswert?

Gonzo schrieb:
> geht nicht der pc bricht ab

Wasde nich sachs.

von (prx) A. K. (prx)


Lesenswert?

Mars schrieb:

> Der Speicher bleibt reserviert, bis dein Programm endet.

Systemseitig üblicherweise sowieso, da einmal mit malloc() allozierter 
Speicher meistens auch nach Deallokation mit free() im Prozess 
verbleibt. Anders verhalten sich naturgemäss die Allokationsfunktionen 
des Betriebssystems.

Innerhalb des Prozesses wird üblicherweise irgendwann der Adressraum 
platzen, jedenfalls bei 32 Bit Programmen. Der physikalische Speicher 
vielleicht auch, aber nur dann wenn der allozierte Speicher auch mal 
verwendet wird, oder wenn bei 64 Bit Programmen die Speicherverwaltung 
selbst nicht mehr in den Speicher passt. Solange der Speicher nur 
alloziert wird, ist ihm in der Standardkonfiguration der gängigen 
Betriebssteme noch kein physikalischer Speicher zugeordnet, sind es nur 
Adressen. Das ändert sich erst beim ersten Zugriff darauf, und zwar für 
jede Speicherseite einzeln.

Alternativ gibt es Speicherverwaltung mit garbage collection. Auch in 
C/C++ wenngleich die Implementierung da etwas tricky ist. In dem Fall 
werden als nicht mehr referenziert erkannte Speicherbereiche automatisch 
freigegeben. Siehe http://www.hpl.hp.com/personal/Hans_Boehm/gc.

von Rolf Magnus (Gast)


Lesenswert?

> Solange der Speicher nur alloziert wird, ist ihm in der
> Standardkonfiguration der gängigen Betriebssteme noch kein
> physikalischer Speicher zugeordnet, sind es nur Adressen.
> Das ändert sich erst beim ersten Zugriff darauf, und zwar für
> jede Speicherseite einzeln.

Kommt drauf an, wie der Allokator von malloc aufgebaut ist. Oft wird 
z.B.
vor dem Anfang des allokierten Blocks seine Größe vermerkt. Die im 
Beispiel angegebene Größe ist mit 100 Bytes aber kleiner als eine 
Speicherseite, also muß jede so angeforderte Seite sofort physikalischem 
Speicher zugeordnet werden, um die Verwaltungsinformationen von malloc 
zu speichern.

von Peter (Gast)


Lesenswert?

> Systemseitig üblicherweise sowieso, da einmal mit malloc() allozierter
> Speicher meistens auch nach Deallokation mit free() im Prozess
> verbleibt.
Also unter windows ist das nicht so, wenn ich z.b. 1Mb speicher 
anfordere sehe ich im Taskmanager das mein Prozess mehr speicher 
braucht, wenn ich ihn mit Free freigebe dann wird es auch im Taskmanager 
weniger.
Wenn man mit der STL arbeitet dann wird der speicher für die Stukturen 
nicht freigeben und bleibt reserviert, aber speicher der dir free 
freigegeben wird geht zurück an das BS.

von Rolf Magnus (Gast)


Lesenswert?

> Wenn man mit der STL arbeitet dann wird der speicher für die
> Stukturen nicht freigeben und bleibt reserviert,

Man kann ihn aber manuell freigeben, indem man den Container mit einem 
leeren swappt.

von P. S. (Gast)


Lesenswert?

Peter schrieb:

> Also unter windows ist das nicht so, wenn ich z.b. 1Mb speicher
> anfordere sehe ich im Taskmanager das mein Prozess mehr speicher
> braucht, wenn ich ihn mit Free freigebe dann wird es auch im Taskmanager
> weniger.

Mit "ueblicherweise" meinen die Leute meist Linux, weil sie nix anderes 
kennen...

von Rolf Magnus (Gast)


Lesenswert?

> Mit "ueblicherweise" meinen die Leute meist Linux, weil sie nix anderes
> kennen...

Dann wohl eher weil sie Linux nicht kennen, denn da wird der Speicher 
auch wieder zurückgegeben.

von (prx) A. K. (prx)


Lesenswert?

Das hat weder mit Linux noch mit Windows irgend etwas zu tun. Alle 
Betriebssystem erlauben es, Speicher wieder freizugeben. Es ist 
ausschliesslich eine Frage der Implementierung der verwendeten 
Funktionen zur Speicherallokation wie malloc/free.

Allerdings könnt ihr insofern recht haben, als modernere Libraries wohl 
tatsächlich Speicher auch wieder freigeben. Das war indes nicht immer 
so.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.