[英]Valgrind reports different numbers of allocs and frees, yet all blocks freed
[英]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" );
}
-g
编译所有代码,你应该很容易找到它 检查内存泄漏是使用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.