Frage zum Fehlschlagen von malloc() etc....



  • Hallo Leute,

    hab da noch eine Frage, die mir meine Doku nicht eindeutig beantworten konnte. Und zwar, was genau passiert, wenn malloc(), bzw. realloc() oder calloc() fehlschlagen und einen NULL-Pointer zurückgeben. Kann es dann trotzdem sein dass schon Speicher reserviert worden ist, aber z.B. nicht genug reserviert werden konnte und die Funktion deshalb fehlschlug. Sollte man, wenn man prüft, ob malloc() einen NULL-Pointer geliefert hat, in der Fehlerbehandlung noch free() benutzen oder ist das evtl. sogar gefährlich, weil sich der Pointer evtl. noch gar nicht im Heap befindet?

    Und noch eine Frage, kann ich folgendes machen:

    char *str=(char *)malloc(10*sizeof(char));
    str=(char *)malloc(5*sizeof(char));
    

    sind dann hinterher 10*sizeof(char) Bytes irgendwo im Heap reserviert und quasi verloren und 5*sizeof(char) Bytes für str reserviert, oder wird bei einem Aufruf von malloc() automatisch free() aufgerufen? Oder sind vielleicht immer noch 10*sizeof(char) Bytes reserviert und davon von 5*sizeof(char) Bytes für str und die anderen 5 unzugeordnet?

    Danke für eure Hilfe

    Grüße
    David.



  • Kann es dann trotzdem sein dass schon Speicher reserviert worden ist, aber z.B. nicht genug reserviert werden konnte und die Funktion deshalb fehlschlug.

    Wenn malloc 0 liefert, gibt es für dich nichts mehr zu tun. Für dich bedeutet das: "es war kein Speicher mehr". Das bedeutet gleichzeitig: "Du musst keinen Speicher freigeben."

    Sollte man, wenn man prüft, ob malloc() einen NULL-Pointer geliefert hat, in der Fehlerbehandlung noch free() benutzen oder ist das evtl. sogar gefährlich, weil sich der Pointer evtl. noch gar nicht im Heap befindet?

    Gefährlich ist das nicht. Nur überflussig. Der Aufruf von free auf einem Nullpointer ist eine Noop. Auch muss sich nicht der Ptr im Heap befinden sondern das worauf der Ptr zeigt. 0 ist garantiert kein Bereich im Heap, aber als spezieller Pointer-Wert auch kein Problem für free.

    Und noch eine Frage, kann ich folgendes machen:

    char *str=(char *)malloc(10*sizeof(char)); 
    str=(char *)malloc(5*sizeof(char));
    

    ...
    ...

    sind dann hinterher 10*sizeof(char) Bytes irgendwo im Heap reserviert und quasi verloren

    Genauso ist es. Da du jedes Handle auf den Speicher verloren hast, gibt es keine Möglichkeit mehr für dich (deinen Prozess), diesesn Speicher freizugeben.

    oder wird bei einem Aufruf von malloc() automatisch free() aufgerufen?

    Nein.

    Oder sind vielleicht immer noch 10*sizeof(char) Bytes reserviert und davon von 5*sizeof(char) Bytes für str und die anderen 5 unzugeordnet?

    Nein.



  • ok, alles klar 🙂

    Vielen Dank für die Hinweise.



  • oha, das malloc() nicht free() aufrufen kann, darauf hät ich ja auch noch selber kommen können...logisch, wenn die Funktion keinen Pointer geliefert bekommt, den Sie vorher freigeben soll...tststs 🙂

    Dafür ist also der 1. Paramter bei realloc gedacht, oder?


Anmelden zum Antworten