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:
la taille demandée est toujours 1 ( sizeof (char) ): utilisez malloc.
Vous ne vérifiez jamais que result n'est pas null donc que result se doit d'être libéré avant d'appeler calloc.
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.
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.
[^] # Re: Reallocation sans free ?
Posté par David Marec . En réponse au message ma j'galère sur un simple free sur un string. Évalué à 2.
Clairement: tout ce que je vous indique est valide, quoi que vous fassiez en amont.
Ré-allouer, c'est appeler
realloc, pascalloc. Je le répète: vos appels àcallocn'ont pas de sens:1(sizeof (char)): utilisezmalloc.resultn'est pasnulldonc queresultse doit d'être libéré avant d'appelercalloc.reallocfonctionne 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.
C'est vous qui le dite, pas votre code:
Si en fait, vous vouliez allouer
resultparce qu'il ne l'était pas ou plus, vérifiez le directement:Enfin:
En fait, memcheck.
Pour avoir plus de précision sur l'origine de la fuite, utilisez
--leak-check=fullet consorts.