c - malloc - free

Gast #5538194
Lesenswert?

Hallo zusammen,

kleine konzeptionelle Frage. Ich bastle zur Zeit an einem Programm bei 
dem ich über malloc Speicher reserviere und den Inhalt einer Datei lade. 
Das Programm läuft quasi in einer Endlosschleife, wodurch ich es zu 99% 
mit dem X schließe.

Quasiablauf:
- malloc(...)
- while(1){...}
- free(...);

Nach meinem Verständnis erreiche ich free() nie. Wie löst man so ein 
Problem elegant?
Persönliche Seite #5538196
Lesenswert?

ich schrieb:
> Das Programm läuft quasi in einer Endlosschleife, wodurch ich es zu 99%
> mit dem X schließe.

Das bedeutet, daß Du es "abschießt", und daß es unter Windows läuft.

Von einem Prozess belegter Speicher (und andere Ressourcen) wird beim 
Beenden des Prozesses automatisch freigegeben; Du musst Dich also nicht 
zwingend darum kümmern, free() aufzurufen.

Sauberer wäre allerdings ein Programmdesign, das einen sauberen Abbruch 
ermöglicht - wenn Du beispielsweise eine geöffnete Datei hast, in die 
Dein Programm hineinschreibt, wird diese beim "Abschießen" nicht sauber 
geschlossen.
#5538384
Lesenswert?

ich schrieb:
> Das Programm läuft quasi in einer Endlosschleife, wodurch ich es zu 99%
> mit dem X schließe.
>
> Quasiablauf:
> - malloc(...)
> - while(1){...}
> - free(...);
>
> Nach meinem Verständnis erreiche ich free() nie. Wie löst man so ein
> Problem elegant?

Es ist gelöst, schliesst du das Fenster in dem das Programm läuft (kann 
ja nur eine Konsolenanwendung sein), wird auch der Speicher wieder 
freigegeben.

Aber so ein Programm ist natürlich Scheisse. Man sollte Programme nicht 
abschiessen mmüssen, sondern ordnungsgemäss herunterfahren können, mit 
Close-Button, mit Close-Menükommando, mit Tastatur falls es auf Eingaben 
wartet, mit allem was angemessen ist.

Das WM_CLOSE wäre für ein Windows-Fenster-Programm die richtige Wahl, 
dafür muss man halt ein richtiges Windows Programm schreiben.

Man bedenke auch, daß Programme die in while(1) Endlosschleifen 
stecken,s ständig den prozessor auslasten und das System belasten und 
falls es einen Akku giubt den leersaugen und andere Programme nicht zum 
Zug kommen lassen. Schon alleine daher ist so eine Endlosschleife eher 
schlecht. Man baut event driven Programme, ereignisgesteuerte, deren 
Hauptschleife beendet wird wenn das Programm beendet werden soll.

Falls das malloc eine immer gleiche Grösse anfordert, sollte man den 
Speicher eh statisch anlegen.

char buffer[1234];
while(1) { ... };

Dann staret das Programm nur wenn genug Speocher verfügbar ist.
Gast #5538702
Lesenswert?

Michael B. schrieb:

> Man baut event driven Programme, ereignisgesteuerte, deren
> Hauptschleife beendet wird wenn das Programm beendet werden soll.

Und das kann man auch gut in einer Endlosschleife machen, wo man auf 
irgendwas blockiert, bis eine Aktion kommt. Beispielsweise kann man auf 
I/O blockierend warten, was man dann reinpipen kann.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren