Kann durch malloc(0) ein Speicherleck entstehen



  • man malloc

    malloc() allocates size bytes and returns a pointer to the allocated
    memory.

    und wenn 0 uebergeben wird, wird genau 0 byte allokiert, also ganix



  • Setzt die Pointer doch anfangs auf NULL, und dann führe malloc aus, und lass dir das Ergebnis zeigen.
    Wenn wieder NULL rauskommt, dann ists klar dass nix allokiert wurde.

    Grüße,
    Harri



  • MSDN schrieb:

    If size is 0, malloc allocates a zero-length item in the heap and returns a valid pointer to that item

    Also musst du das auch wieder freigeben.

    Viele Grüße
    Fischi



  • Wenn malloc etwas anderes als NULL liefert, muss man auch free() aufrufen.



  • die meisten 'mallocs' legen eine struktur variabler länge auf dem heap an, die umso grösser ist, je mehr bytes man anfordert. ungefähr sowas:

    struct heap_block
    {
       // irgendwelche infos, die diesen heap block beschreiben
       struct heap_block *naechster;
       struct heap_block *vorheriger;
       unsigned int wieviel;
       ...
       ...
       ...
       char dein_angeforderter_speicher[wieviel]; 
    }
    

    als rückgabe bekommt man einen pointer auf dieses array da.
    wenn man 'malloc(0)' aufruft, wird trotzdem die struktur erzeugt, nur das array hat die länge 0
    'free' zieht dann einen festen betrag ab und bekommt damit einen pointer auf den anfang der struct.



  • Jedem malloc Aufruf muss ein free folgen, wenn malloc keine Fehler zurück liefert



  • Danke für die Hilfe. Ihr habt mir wirklich geholfen. Scheint wohl so zu sein, dass man (auch wenn es unlogisch klingt) trotzdem free verwenden muss.



  • Wolfgke(Gast) schrieb:

    Danke für die Hilfe. Ihr habt mir wirklich geholfen. Scheint wohl so zu sein, dass man (auch wenn es unlogisch klingt) trotzdem free verwenden muss.

    Bedenke dass free() immer weiss wieviel Speicher es free'en muss. Eine 08/15 Implementierung von malloc() könnte zB so aussehen:

    void* malloc(int size)
    {
      int* p;
      size+=sizeof(int);
      p=hole_speicher(size);
      *p=size;
      return p+1;
    }
    

    wobei hole_speicher die Betriebssystem Funktion zum Speicher allokieren ist.

    Wenn size nun 0 ist, wird hier trotzdem sizeof(int) allokiert (um sich eben die größe zu merken).



  • Shade Of Mine schrieb:

    Wolfgke(Gast) schrieb:

    Danke für die Hilfe. Ihr habt mir wirklich geholfen. Scheint wohl so zu sein, dass man (auch wenn es unlogisch klingt) trotzdem free verwenden muss.

    Bedenke dass free() immer weiss wieviel Speicher es free'en muss. Eine 08/15 Implementierung von malloc() könnte zB so aussehen:

    void* malloc(int size)
    {
      int* p;
      size+=sizeof(int);
      p=hole_speicher(size);
      *p=size;
      return p+1;
    }
    

    wobei hole_speicher die Betriebssystem Funktion zum Speicher allokieren ist.

    Wenn size nun 0 ist, wird hier trotzdem sizeof(int) allokiert (um sich eben die größe zu merken).

    Wie hieße hole_speicher im Fall von Windows? Is das ne Winapi Funktion?



  • möööppppppppppp schrieb:

    Wie hieße hole_speicher im Fall von Windows? Is das ne Winapi Funktion?

    Ja. Da gibt es einige - ich bin nicht mehr ganz fit in der WinAPI - aber IIRC verwendet man normalerweise HeapAlloc oder VirtualAlloc - schlag es halt in der MSDN nach 😉


Anmelden zum Antworten