2014-10-09 90 views
4

我想弄清楚我的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) ; 

任何帮助都会很棒。谢谢。

回答

10

valgrind是显示你在哪里泄漏的内存被分配,但实际的错误已被追踪到内存结束

很明显,您在main中分配给sstr后,您从来没有free那。

+0

所以'免费(SSTR)'主要)? – user4127382 2014-10-09 23:18:00

+0

@ user4127382对。当然,你必须确保在你使用它之后。 – o11c 2014-10-09 23:19:16

-2

@ o11c 您给出了错误的建议。 见链接: http://c-faq.com/ptrs/passptrinit.html

另一种解决方案是让函数返回指针:字符* SSTR = songToString(松1)`(即位于后`

int *f() 
{ 
    static int dummy = 5; 
    return &dummy; 
} 

... 

int *ip = f();