• [^] # Re: Reallocation sans free ?

    Posté par . En réponse au message ma j'galère sur un simple free sur un string. Évalué à 2.

    je vais tenter d'expliquer cette partie du code:

    Clairement: tout ce que je vous indique est valide, quoi que vous fassiez en amont.

    [SNIP] Il est censé être ré-allouer

    Ré-allouer, c'est appeler realloc, pas calloc. Je le répète: vos appels à calloc n'ont pas de sens:

    1. la taille demandée est toujours 1 ( sizeof (char) ): utilisez malloc.
    2. Vous ne vérifiez jamais que result n'est pas null donc que result se doit d'être libéré avant d'appeler calloc.
    3. Petite astuce realloc fonctionne comme un malloc si le pointeur n'avait pas été alloué en premier lieu. Vous pouvez l'utiliser partout. (mais ça donnera l'impression que vous ne maîtrisez pas vous allocations.)

    Et cela se retrouve dans plusieurs parties de votre code.

    1. len: somme des longueurs des strings à concaténer ( ne peut pas être égal à 0 ):

    C'est vous qui le dite, pas votre code:

    *size = len; /* copie de la valeur de len dans size*/
    if(!*size) /* si size vaut 0, donc si len vaut 0 ==> if(len==0) */
     *result = /* et si result devait etre lib'er'e d'abord ? */
     calloc(len + 1, sizeof(char)); /* malloc (len+1), donc malloc(1) */

    Si en fait, vous vouliez allouer result parce qu'il ne l'était pas ou plus, vérifiez le directement:

    if(NULL==result)

    Enfin:

    valgrind

    En fait, memcheck.
    Pour avoir plus de précision sur l'origine de la fuite, utilisez --leak-check=full et consorts.