2011-12-18 58 views
5

看起来奇怪:只是一个循环,33个泄漏

$> cat main.c 
#include <stdio.h> 
int main(int ac, char **av) { 
    for (int i = 0; i < ac; i++) 
     printf("%s\n", av[i]); 
    return 0; 
} 
$> gcc main.c -std=c99 
$> valgrind ./a.out hello my friends 

这里是结果:

==725== Memcheck, a memory error detector 
==725== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. 
==725== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info 
==725== Command: ./a.out hello my friends 
==725== 
--725-- ./a.out: 
--725-- dSYM directory is missing; consider using --dsymutil=yes 
./a.out 
hello 
my 
friends 
==725== 
==725== HEAP SUMMARY: 
==725==  in use at exit: 6,146 bytes in 33 blocks 
==725== total heap usage: 33 allocs, 0 frees, 6,146 bytes allocated 
==725== 
==725== LEAK SUMMARY: 
==725== definitely lost: 0 bytes in 0 blocks 
==725== indirectly lost: 0 bytes in 0 blocks 
==725==  possibly lost: 0 bytes in 0 blocks 
==725== still reachable: 6,146 bytes in 33 blocks 
==725==   suppressed: 0 bytes in 0 blocks 
==725== Rerun with --leak-check=full to see details of leaked memory 
==725== 
==725== For counts of detected and suppressed errors, rerun with: -v 
==725== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 1 from 1) 

如果有人知道为什么,可能请解释一下这些泄漏来自哪里,我会很感激!

祝你有美好的一天:-)

+0

用'--leak-check = full'重新运行。您可能会看到,分配是由您的环境完成的系统工作(一次性启动/初始化事情),这些并非真正的泄漏。 – Mat 2011-12-18 09:34:44

+1

您是否按照valgrind输出消息的建议“重新运行--leak-check = full以查看泄漏内存的详细信息”? – bobbymcr 2011-12-18 09:34:51

回答

9

这些都不是泄漏。列为still reachable的对象不应该麻烦你。如果你在上面的行中有一个非零值,那么它应该会响起一个警钟!

列出为still reachable的33个块最有可能是您的标准库调用printf内部的一些块。没有什么可担心的。

考虑也看看this answer到类似的问题。

+0

完美。感谢您的回答:-) – DCMaxxx 2011-12-18 11:26:52

3

"still reachable"程序终止时真的没有什么可担心的。

"still reachable"表示分配的内存尚未释放,但仍有指向此内存的指针。因此valgrind不会将其标记为真正的内存“泄漏”。

花费时间往往是浪费时间:在应用程序结束之前分配的内存,分配的内存将无论如何返回到操作系统,因为应用程序正在终止。

+0

根据我的经验,尝试在运行结束时正确释放所有对象非常重要。我发现了很多错误。确实,所谓的“泄漏”的严重性是微乎其微的,但它所施加的正确性的行为具有广泛的再执行。在大型项目上,它可以带来真正的变化。它实际上是在我工作的两个大项目(C的500K和150K行)上进行的。 – 2011-12-18 11:33:54