我一直在研究调试分叉 TCP 服务器中的内存使用情况。我认为我做得很好,我似乎无法在“堆摘要”中找到有关“分配的字节数”的信息。我的服务器运行时间越长,这个数字似乎就在不断增加:
==27526==
==27526== HEAP SUMMARY:
==27526== in use at exit: 0 bytes in 0 blocks
==27526== total heap usage: 113 allocs, 113 frees, 283,043 bytes allocated
==27526==
==27526== All heap blocks were freed -- no leaks are possible
==27526==
==27526== For counts of detected and suppressed errors, rerun with: -v
==27526== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
==27528==
==27528== HEAP SUMMARY:
==27528== in use at exit: 0 bytes in 0 blocks
==27528== total heap usage: 120 allocs, 120 frees, 300,808 bytes allocated
==27528==
==27528== All heap blocks were freed -- no leaks are possible
==27528==
==27528== For counts of detected and suppressed errors, rerun with: -v
==27528== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
==27537==
==27537== HEAP SUMMARY:
==27537== in use at exit: 0 bytes in 0 blocks
==27537== total heap usage: 127 allocs, 127 frees, 318,573 bytes allocated
==27537==
==27537== All heap blocks were freed -- no leaks are possible
==27537==
==27537== For counts of detected and suppressed errors, rerun with: -v
==27537== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
尽管 Valgrind 报告 allocs 和 free 是相等的,并且不可能发生泄漏,但我不相信分配的字节会增加。
所以:如果分配的字节数不断增加,这是否意味着即使 Valgrind 报告不可能发生泄漏,我也必须从堆中的某个地方解除分配?
谢谢!
编辑:随着 Gordon Bailey 的回答和其他提示,我仍然有点厌倦。写了这个小应用程序:
/* client.c */
#include <stdio.h>
void child_func(int childnum);
int main(int argc, char *argv[])
{
int nchildren = 1;
int pid;
int x;
if (argc > 1)
{
nchildren = atoi(argv[1]);
}
for (x = 0; x < nchildren; x++)
{
if ((pid = fork()) == 0)
{
child_func(x + 1);
exit(0);
}
}
wait(NULL);
return 0;
}
void child_func(int childnum)
{
int i;
for (i = 0; i < 1000; i++) {
free(malloc(1));
}
sleep(1);
}
当我运行这个 Valgrind 输出是:
==28245== HEAP SUMMARY:
==28245== in use at exit: 0 bytes in 0 blocks
==28245== total heap usage: 1,000 allocs, 1,000 frees, 1,000 bytes allocated
==28245==
==28245== All heap blocks were freed -- no leaks are possible
==28245==
==28245== For counts of detected and suppressed errors, rerun with: -v
==28245== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
==28246== HEAP SUMMARY:
==28246== in use at exit: 0 bytes in 0 blocks
==28246== total heap usage: 1,000 allocs, 1,000 frees, 1,000 bytes allocated
==28246==
==28246== All heap blocks were freed -- no leaks are possible
所以看起来堆上的所有内存都被清除了,并且与我的应用程序的输出肯定不同。