在工作中我用C编写了一个相当复杂的软件,我经常用valgrind测试它。到目前为止,该程序完美地工作,没有内存泄漏或数组边界违规,并且在valgrind报告中,'frees'的数量与'mallocs'的数量相匹配 - 非常好。让我烦恼的是它报告了成千上万的frees和mallocs。我知道事实上我的表现不超过50-60。我知道当我的程序调用'fopen'时,valgrind对mallocs的数量进行调用,类似'fclose'计入'frees'的数量。但在我的情况下,这仍然没有解释我看到的内存被释放和释放多少次的数字。我仔细搜索了我的代码,找到了罪魁祸首,但我一无所获。由于显而易见的原因,我不能在这里发布任何代码,但我只是想知道,我错过了什么?还有其他C操作,valgrind计算mallocs和释放的数量吗?
这是我的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)
答案 0 :(得分:0)
好吧,如果你调用执行malloc和free调用的库函数,你会看到很多分配和释放。一些库函数,执行分配的系统调用是strdup,pthread_create,timer_create,e.t.c
答案 1 :(得分:0)
请记住,有许多函数调用可以分配内存,strdup,fopen,创建线程,加载共享对象,解析时区或语言环境信息(作为时间相关的函数可能需要),3.d方库可以分配内存方式的数量,等等。
但是,使用valgrind massif工具运行你的程序http://valgrind.org/docs/manual/ms-manual.html(阅读那些文档)
e.g。
valgrind --depth=20 --tool=massif ./Calc
这将生成一个massif.out.XXX文件,该文件向您显示各种分配源以及堆的快照,例如:作为摘录:
snapshot=9
#-----------
time=137984
mem_heap_B=640
mem_heap_extra_B=40
mem_stacks_B=0
heap_tree=peak
n2: 640 (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
n1: 352 0x4BFD095A: __fopen_internal (in /usr/lib/libc-2.17.so)
n1: 352 0x4BFD0A39: fopen@@GLIBC_2.1 (in /usr/lib/libc-2.17.so)
n0: 352 0x8048784: main (tailq_example.c:63)
n5: 288 0x8048580: add_block (tailq_example.c:20)
n0: 72 0x8048748: main (tailq_example.c:60)
n0: 72 0x804875C: main (tailq_example.c:61)
n0: 72 0x80487DC: main (tailq_example.c:72)
n0: 72 0x80487F0: main (tailq_example.c:73)
n0: 0 in 1 place, below massif's threshold (01.00%)