mikrocontroller.net

Forum: PC-Programmierung Speicher nicht freigeben


Autor: Gonzo (Gast)
Datum:

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

Autor: Mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Speicher bleibt reserviert, bis dein Programm endet.

Autor: drusius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Je nach BS auch darüber hinaus....

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Gonzo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gonzo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Gonzo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht nicht der pc bricht ab

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gonzo schrieb:
> geht nicht der pc bricht ab

Wasde nich sachs.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.