我今天在C上编写了一个链接列表,在Linux机器上工作,所有内容都在Valgrind中检出。然后我在OS X上在家里运行相同的测试(少数推送然后删除列表)并获得了大量的分配。
==4344== HEAP SUMMARY:
==4344== in use at exit: 26,262 bytes in 187 blocks
==4344== total heap usage: 267 allocs, 80 frees, 32,374 bytes allocated
==4344==
==4344== LEAK SUMMARY:
==4344== definitely lost: 0 bytes in 0 blocks
==4344== indirectly lost: 0 bytes in 0 blocks
==4344== possibly lost: 0 bytes in 0 blocks
==4344== still reachable: 0 bytes in 0 blocks
==4344== suppressed: 26,262 bytes in 187 blocks
==4344==
==4344== For counts of detected and suppressed errors, rerun with: -v
==4344== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
我知道代码很好,没有任何泄漏。所以我只是注释掉了列表测试,并在main中只编译了printf("test\n");
,它显示了263个带有76个释放的分配(我在列表测试中有4个有意的分配)。为什么我在OS X上获得了这么多的分配?这只是操作系统的功能吗?我不明白为什么当我做一个printf时我为什么会有263个分配...
答案 0 :(得分:0)
Valgrind对OS X的支持目前正在积极开展。您最好的方法是确保使用SVN中继版本,并经常更新。
Valgrind向您报告的错误存在于OS X系统库中。这些不是你的程序的错,但是因为即使是简单的程序,包括这些系统库,Valgrind也会继续捡起它们。 Valgrind主干中的抑制不断更新以捕获这些问题,使您可以专注于代码中可能存在的实际问题。
以下命令允许您使用Valgrind trunk,如果您还没有:
svn co svn://svn.valgrind.org/valgrind/trunk valgrind
cd valgrind
./autogen.sh
./configure
make -j4
sudo make install
完全披露:我是Valgrind开发人员之一,他们提供了支持OS X 10.11的补丁
答案 1 :(得分:-1)
OS X的架构非常糟糕。由于libdl
,libdyld
,libm
,libc
和其他一些库被“打包”到libSystem
中,因此在加载库时会初始化所有这些库。他们大多来自dyld。 Dyld是用C和C ++编写的,这就是为什么C ++部分可以推高分配数量的原因。
这只是Apple的事情,而不是OS X的事情。我写了一个替代的C库。它没有很多“不需要的分配”。
此外,分配是由打开FILE *
引起的。请注意,3个流(stdin
,stdout
和stderr
)会在运行时初始化。