Wo free() aufrufen?



  • Hallo,

    ich arbeite an einer Software (bereits geschrieben), die leider nur reines C benutzt. Am Anfang wird viel allokiert mit malloc() und spaeter dann an vielen Stellen bei Fehlern oft mit exit() das Programm beendet.

    Wie mach ich denn bei einem Code am besten mein free() hin?



  • Vor exit() brauchste kein free. Den Speicher, den das Programm sich besorgt hat, holt sich das Betriebssystem alles wieder.

    Und die anderen free()-Aufrufe also nicht im Fehlerfall, sind ja kein Problem, hoffe ich.



  • volkard schrieb:

    Vor exit() brauchste kein free. Den Speicher, den das Programm sich besorgt hat, holt sich das Betriebssystem alles wieder.

    Mach das mal unter Windows 95!



  • Dann schau die mal die Funktion atexit an: http://www.cplusplus.com/reference/clibrary/cstdlib/atexit/

    Damit kannst du dein Aufräumfunktion bekannt geben, dami sie bei exit() aufgerufen wird.



  • Schlechte Proger entdeckt schrieb:

    volkard schrieb:

    Vor exit() brauchste kein free. Den Speicher, den das Programm sich besorgt hat, holt sich das Betriebssystem alles wieder.

    Mach das mal unter Windows 95!

    Keil Problem. Auch Win95 kann das.


  • Mod

    volkard schrieb:

    Schlechte Proger entdeckt schrieb:

    volkard schrieb:

    Vor exit() brauchste kein free. Den Speicher, den das Programm sich besorgt hat, holt sich das Betriebssystem alles wieder.

    Mach das mal unter Windows 95!

    Keil Problem. Auch Win95 kann das.

    Aber Amiga OS 1.0 kann das nicht. Da gibt's bestimmt auch C-Compiler für diese Plattform :p .



  • Generell gilt: Zu jedem malloc() gehört logisch ein free(). Man kann jedoch manche Ausnahmen gelten lassen. Bei mir (embedded- Zeugs) ist es oft so, daß ich ein Powerdown- Signal kriege und da speichere ich die Sachen einfach in ein EEPROM oder Flash und schalte die Hardware ab und warte dann, daß der Watchdog- Timer die Kiste resettet. Konkret Speicher aufräumen - nö.
    volkard gehört der C++ Ecke an, da schmeißt man eine exception, die beim Übergeben schon eine besenreine Sache hinterläßt. Zudem kommt noch das OS ins Spiel. Entweder es reißt den gesamten Kontext sauber ab oder eben nicht. Amiga OS und Win95 sind zwar nicht mehr zeitgemäß, aber Vertreter, die es bestenfalls "mal so, mal so" machen. Auch, wenn volkard auf w95 schwören mag, drauf verlassen würd' ich mich nicht.
    Nächste Faustregel ist, daß man wenigstens modulweise saubere Stube hinterläßt. In einer Funktion ein Label cleanup: zu haben, das man ggf. per goto anspringt, ist übrigens keine Schande, sondern durchaus probat.
    In der FAQ gibt's hier einen oft zitierten und zu wenig gelesenen Artikel zu malloc und free.


Log in to reply