繁体   English   中英

即使释放了所有堆块,Valgrind也会出错

[英]Valgrind errors even though all heap blocks were freed

我最近养成了通过valgrind运行所有程序来检查内存泄漏的习惯,但是大部分结果对我来说都有点神秘。

对于我最近的跑步, valgrind -v给了我:

All heap blocks were freed -- no leaks are possible

这意味着我的程序被内存泄漏所覆盖,对吗?

那么这个错误意味着什么? 我的程序没有正确读取某些内存块吗?

ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 14 from 9)

1 errors in context 1 of 1:
Invalid read of size 4
   at 0x804885B: findPos (in /home/a.out)
   by 0xADD918: start_thread (pthread_create.c:301)
   by 0xA26CCD: clone (clone.S:133)
 Address 0x4a27108 is 0 bytes after a block of size 40 alloc'd
   at 0x4005BDC: malloc (vg_replace_malloc.c:195)
   by 0x804892F: readInput (in /home/a.out)
   by 0xADD918: start_thread (pthread_create.c:301)
   by 0xA26CCD: clone (clone.S:133)

used_suppression:     14 dl-hack3-cond-1

此外,这里所谓的“抑制”错误是什么?

这似乎很明显......但值得指出的是"no leaks are possible"消息并不意味着你的程序不能泄漏; 它只是意味着它在测试的配置中没有泄漏。

如果我使用没有命令行参数的valgrind运行以下命令,它会通知我没有泄漏是可能的。 但是如果我提供命令行参数,它确实会泄漏。

int main( int argc, char* argv[] )
{
   if ( argc > 1 )
      malloc( 5 );
   printf( "Enter any command line arg to cause a leak\n" );
}
  1. 是的,你被大大覆盖,不要以为valgrind很容易错过用户代码泄漏
  2. 您的错误意味着索引数组变量时可能会出现+1错误。 valgrind告诉你的那些行应该准确,所以如果用-g编译所有代码,你应该很容易找到它
  3. 抑制错误通常来自系统库,系统库有时会出现小漏洞或线程状态变量等不可检测的错误。 您的手册页应列出默认使用的抑制文件

检查内存泄漏是使用valgrind的一个原因,但我想说更好的理由是在代码中发现更严重的错误,例如使用无效的数组下标或取消引用未初始化的指针或指向释放内存的指针。

如果valgrind告诉你在运行valgrind时运行的代码路径没有导致内存泄漏,这是很好的,但是不要让它忽略更严重错误的报告,例如你在这里看到的错误。

正如其他人所建议的那样,在使用调试信息(-g)进行编译后重新运行valgrind将是一个很好的下一步。

如果您收到以下错误: - “读取大小4无效”

你之前是否释放记忆然后再进入下一个论点? 我也得到错误,因为在链表中我首先释放内存然后转到下一个元素。 下面是我的代码片段,我收到错误 -

void free_memory(Llist **head_ref)
{
    Llist *current=NULL;

    current=*head_ref;
    while(*head_ref != NULL)
    {
        current=*head_ref;
        free(current);
        current=NULL;
        (*head_ref)=(*head_ref)->next;
    }
}

以下更改后是我的代码段 -

void free_memory(Llist **head_ref)
{
    Llist *current=NULL;
    current=*head_ref;
    while(*head_ref != NULL)
    {
        current=*head_ref;
        (*head_ref)=(*head_ref)->next;
        free(current);
        current=NULL;
     }
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM