Memory Leak bei Reallokation



  • Hallo,
    ich habe mal versucht eine funktion zu schreiben die mir bei einem string mehr speicher allokiert. Da ich versucht habe moeglichst vorsichtig zu implementieren, habe ich zunaechst eine temporaere Variable mit Reallok erweitert und weise deren Adresse dann der eigentlichen zu.
    Nun habe ich mir ueberlegt, dass ich ja eigentlich bei einer Zuweisung eines Zeigers in einen anderen (beide auf allokierten speicher), ja den Empfaenger-Zeiger ja vorher free-en muesste, da ich sonst ein Speicherleck habe (oder nicht?), nur in meinem Fall sh unten fuehrt ein vorheriges free(*str) zu einem Segfault. Warum?

    int get_more_space(char** str, unsigned int* str_size, const unsigned int how_much_more)
    {
      char* tmp = NULL;
      if((tmp = malloc((*str_size) * sizeof(*tmp))) == NULL) return -1;
    
      if((tmp = realloc(*str, (*str_size + how_much_more))) == NULL){
        if(tmp!=NULL) free(tmp);
        tmp = NULL;
        return -1;
      }
    // muesste hier nicht ein free(*str) stehen -> memory leak??
    // free(*str);
      *str = tmp;
      *str_size += how_much_more;
    
      return 0;
    }
    


  • realloc gibt den alten Speicher frei, dass muss du nicht mehr machen.

    Wozu das erste malloc? brach man nicht!



  • Oups das beispiel sollte folgendermassen aussehen

    int get_more_space(char** str, unsigned int* str_size, const unsigned int how_much_more)
    {
      char* tmp = NULL;
    
      if((tmp = realloc(*str, (*str_size + how_much_more))) == NULL){
        if(tmp!=NULL) free(tmp);
        tmp = NULL;
        return -1;
      }
    // muesste hier nicht ein free(*str) stehen -> memory leak??
    // free(*str);
      *str = tmp;
      *str_size += how_much_more;
    
      return 0;
    }
    

    Ja gut, aber ich uebergebe an realloc() ja nur einen einfachen Pointer *str (also **str einmal dereferenziert) - ist es denn dann ueberhaupt moeglich den Speicher freizugeben in einer Unterfunktion, wie realloc()?

    Wenn ich soetwas schreiben will, brauch ich doch bei Allokation, Freigabe oder Addressaenderung des Pointers in einer Unterfunktion, auch immer einen Doppelpointer als Parameter? Oder ist das eine Sonderregelung, bei der C eigenen Funktion realloc()?



  • Das sollte deine fragen beantworten.

    Eine einfache pseudo funktion realloc

    void *realloc( void* buf, size_t size )
    {
        char *neu;
    
        neu = malloc(...
        ...
        memcpy(...
        ...
        free(buf);
    
        return neu;
    }
    


  • Ah, stimmt ich nehm ja den Return von realloc und nicht das was nach der Funktion vom Parameter noch uebrig bleibt. Danke fuer die Erklaerung! 👍


Anmelden zum Antworten