【发布时间】:2013-10-18 18:30:50
【问题描述】:
在工作中,我正在用 C 语言编写一个相当复杂的软件,并且我经常使用 valgrind 对其进行测试。到目前为止,该程序运行良好,没有内存泄漏或数组边界违规,并且在 valgrind 报告中,“frees”的数量与“mallocs”的数量相匹配 - 很棒。让我烦恼的是它报告了数千个 free 和 malloc。而且我知道一个事实我做的不超过50-60。我确实知道,当我的程序调用“fopen”时,valgrind 会将调用计入 malloc 的数量,同样,“fclose”也会计入“frees”的数量。但就我而言,这仍然不能解释我看到的内存被分配和释放多少次的数字。我仔细搜索了我的代码以寻找罪魁祸首,但我一无所获。由于明显的原因,我不能在这里发布任何代码,但我只想知道,我错过了什么吗?是否还有其他 C 操作使 valgrind 计入 malloc 和 frees 的数量?
这是我的 valgrind 报告。如您所见,从这个角度来看,一切看起来都很好。
Memcheck, a memory error detector
Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
Command: ./Codec
Parent PID: 3526
HEAP SUMMARY:
in use at exit: 0 bytes in 0 blocks
total heap usage: 2,407 allocs, 2,407 frees, 28,877,748 bytes allocated
All heap blocks were freed -- no leaks are possible
For counts of detected and suppressed errors, rerun with: -v
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)
【问题讨论】:
-
for (int i = 0; i != 10000; ++i) { free(malloc(1)); }呢? -
如果您正在调用 C 库例程或正在链接任何库并调用它们,它们可以调用 malloc() 和 free()。
-
在调试器下运行程序,在
malloc()上设置断点。然后进行堆栈跟踪以查看它是从哪里调用的。 -
“我不能在这里发布任何代码,原因很明显”。这些原因并不那么明显,并且将其减少到一个有据可查的SSCCE 并为您的实现提供特定数字将使您的问题更加健壮,特别是如果所述示例具有与您的应用程序类似但最小化的工作流程。就目前而言,答案很明显:如果你没有调用这些函数,那么你调用的是某些函数。
-
“显而易见的原因”指的是我为工作编写的代码,而不是个人使用。我的工作不希望我为所有网络提供我们的代码。此外,答案不显而易见。我非常清楚我正在调用 something,可能是通过 Charlie Burns 和 Pankrates 建议的 C 库间接调用的,valgrind 将其解释为“malloc”和“free”,但我不能告诉那是什么东西。因此,我问“是否还有其他 C 操作使 valgrind 计入 malloc 和 frees 的数量?”我的问题不需要示例代码。