2014-10-06 54 views
3

我仍在学习valgrind和c。我如何消除“无效的免费()”?调试Valgrind in C

错误:

==31415== Invalid free()/delete/delete[]/realloc() 
==31415== at 0x4C2BDEC: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==31415== by 0x400EE1: songDelete (song.c:44) 
==31415== by 0x400B70: main (songtest.c:117) 
==31415== Address 0x51fd9f0 is 0 bytes inside a block of size 14 free'd 
==31415== at 0x4C2BDEC: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==31415== by 0x400EE1: songDelete (song.c:44) 
==31415== by 0x400AD3: main (songtest.c:105) 
....... 

代码:

void songDelete(song *s) 
{ 
    if(s == NULL){ 
     return; 
    } 

    //artist 
    free(s->artist) ; 
    //title 
    free(s->title) ; 
    //time 
    if(NULL != s->lastPlayed) 
     mtimeDelete(s->lastPlayed) ; 
    //song 
    free(s) ; 
    s = NULL; 
} 

我加入free(s);s=NULL;if(s == NULL)..

结构:

typedef struct song_{ 
    char *artist; 
    char *title; 
    mtime *lastPlayed; 
}song; 

所以我不太清楚我会如何解决这个问题?

+0

song.c中的第44行是什么?这就是问题所在。 – HuaTham 2014-10-06 01:55:37

+0

@HuaTham在第44行是'免费(s->艺术家);'任何建议? – guy201485 2014-10-06 01:58:00

+0

你的歌曲结构是相关的。据推测艺术家是不可能分配的东西? – 2014-10-06 02:00:10

回答

0

在主,叫songDelete(&song1);并更改songDelete到:

void songDelete(song **s) 
{ 
    if(*s == NULL){ 
     return; 
    } 

    //artist 
    free((*s)->artist) ; 
    //title 
    free((*s)->title) ; 
    //time 
    if(NULL != (*s)->lastPlayed) 
     mtimeDelete((*s)->lastPlayed) ; 
    //song 
    free(*s) ; 
    *s = NULL; 
} 

这将让你真正引起main变量,如song1实际上被设置为NULL释放之后。

+0

当我编译代码时,它给了我很少的错误:'错误:对于'songDelete' void songDelete(song ** s)''和更少的错误'冲突类型'错误:请求成员'艺术家' union free(* s-> artist); ' – guy201485 2014-10-06 02:49:35

+0

您还需要更改代码中较高的songDelete的原型,如下所示:'void songDelete(song **);' – JohnH 2014-10-06 02:55:45

+0

好吧,我这样做了,得到这个:'song.c:44: 12:错误:请求成员“艺术家”不属于结构或工会 免费(* s->艺术家);'与标题一起并且被lastplayed。 – guy201485 2014-10-06 03:00:30