web-dev-qa-db-ja.com

Valgrindブロックは間違いなく損失記録で失われます

Valgrindのデバッグの何が問題になっているのかを理解しようとしています。私はこのvalgrindをゆっくりと学んでいます。

デバッグ:

_==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==
_

コード(songToString関数):

_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 ;
}
_

SongToStringでは、147行目はsstr = malloc( len ) ;です。

songTest(52行目):

_char * sstr = songToString( song1 ) ;
_

どんな助けでも素晴らしいでしょう。ありがとうございました。

5
user4127382

valgrindは、リークされたメモリがどこにあったかを示しています割り当て済みですが、実際のバグは、そのメモリがどこにあるかを追跡する必要があります最終的に

明らかに、sstrmainに割り当てた後は、それをfreeすることはありません。

16
o11c