Valgrind blocs sont définitivement perdus dans la perte record
Je suis à essayer de comprendre quel est le problème avec mon valgrind de débogage. Je suis en train d'apprendre ce valgrind lentement.
debug:
==1701== HEAP SUMMARY:
==1701== in use at exit: 390 bytes in 12 blocks
==1701== total heap usage: 59 allocs, 47 frees, 1,097 bytes allocated
==1701==
==1701== 39 bytes in 1 blocks are definitely lost in loss record 6 of 12
==1701== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1701== by 0x401246: songToString (song.c:147)
==1701== by 0x40083C: main (songtest.c:52)
==1701==
Code (songToString fonction):
char *songToString(const song *s)
{
char *sstr = NULL ;
char *st = NULL ;
char *sa = NULL ;
char *tt = NULL ;
int len = 0 ;
st = songGetTitle(s) ;
sa = songGetArtist(s) ;
//calculate the total string length needed.
len = strlen("Title: ") + strlen(st) +
strlen(" Artist: ") + strlen(sa) + 1 ;
if (NULL != s->lastPlayed)
{
tt = mtimeToString(s->lastPlayed) ;
len += strlen(" at ") + strlen(tt) ;
}
//allocate enough space for the song
sstr = malloc( len ) ;
sprintf(sstr, "Title: %s Artist: %s", st, sa) ;
if (NULL != s->lastPlayed)
{
sstr = strcat(sstr, " at ") ;
sstr = strcat(sstr, tt) ;
}
free(sa) ;
free(st) ;
free(tt) ;
return sstr ;
}
Dans songToString, ligne 147 est sstr = malloc( len ) ;
dans songTest (ligne 52):
char * sstr = songToString( song1 ) ;
Toute aide serait super. Merci.
OriginalL'auteur user4127382 | 2014-10-09
Vous devez vous connecter pour publier un commentaire.
valgrind
vous montre où la perte de mémoire a été alloué, mais le bug doit être suivi à l'emplacement où la mémoire finit.Évidemment après que vous attribuez à
sstr
dansmain
, vous n'avez jamaisfree
.free(sstr)
aprèschar *sstr = songToString(song1)
(qui est situé dans le principal)?la droite. Bien sûr, vous devez vous assurer que c'est après que vous faites de l'utiliser.
OriginalL'auteur o11c
@o11c
Vous avez donné un mauvais conseil.
Voir le lien:
http://c-faq.com/ptrs/passptrinit.html
Une autre solution est d'avoir le retour de la fonction le pointeur:
OriginalL'auteur user6468372