hallo wenn ich in c oder c++ speicher reserviere und nicht mehr freigebe was passiert dann?
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.
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...
wenn ich zb mit visual studie programmiere unter vista (8Gb ram dann kann ich doch normalerweise sovie speicher verplämbern wie ich will odeer
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.
> 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.
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
> 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);
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!
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.
> 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.
> 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.
> 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.
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...
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.