Valgrind报告的使用内存很大

时间:2013-11-15 18:14:46

标签: c valgrind

我正在编写一个strcat版本,它可以根据输入字符串的大小分配内存。为此,我使用realloc。

我一直在用很多字符串做一些测试。在一些连接9,193个字符串的测试中,得到一个长度为64,344的字符串。我用valgrind检查了它,但我发现结果有点令人不安......

HEAP SUMMARY
    in use at exit: 0 bytes in 0 blocks
    total heap usage: 9193 allocs, 9,193 frees, 338,017,768 bytes allocated

All heap blocks were freed -- no leaks are posible

For counts of detected and suppressed errors, rerun with -v
ERROR SUMMARY: 0 Errors form 0 contexts (suppresed: 0 from 0)

在我看来,该程序运行良好且速度可以接受,但我担心分配的消息为338,017,768字节,我认为这对于简单的字符串连接来说太过分了。

“分配的字节”究竟意味着什么?

感谢。

2 个答案:

答案 0 :(得分:3)

如果程序从未调用free,那么程序将分配的内存量。它与峰值内存使用无关。

通过这样做可以得到相同的结果:

for (int i = 0; i < 338017768; ++i) {
    free(malloc(1));
}

答案 1 :(得分:1)

这可能有两个原因:

a)取决于你如何连接字符串,标准程序是:

allocate enough memory to hold the concatenation
copy both strings into it
deallocate memory occupied by the initial strings

如果您使用大量字符串执行此操作,那么它将分配appx n^2内存,其中n是结果字符串的长度。

b)并非所有分配的内存实际上都被使用,缓冲区通常被分配得比它们需要的大。并非所有实际分配的内存都会附加物理RAM。这是处理虚拟内存的标准方法。

如果我malloc 1 GB的内存,我的进程实际上不会消耗那么多的物理RAM,直到我开始使用它。它将以按需方式以系统页面的形式提供。