2014-10-09 95 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();