2012-01-23 1 views
2

Я использую valgrind, чтобы проверить, что моя программа находится в пределах требуемой границы памяти для класса. Когда я запускаю массив, я получаю симпатичную диаграмму, в которой говорится, что максимальное использование памяти (куча + стек) составляет 21 КБ. Когда я запускаю memcheck valgrind, он говорит мне, что я выделил 185931 байт. В чем разница в том, что они сообщают? Если это имеет значение, в моем коде есть шаг, в котором я пишу две строки, поэтому я изменяю размер первого с помощью realloc, strcat две строки, а затем освобождаю второй.В чем разница между количеством памяти массива и количеством памяти memcheck?

+0

Я думаю, memcheck подсчитывает общую сумму ассигнований. Если вы освободите память и выделите новую, она будет учитываться в memcheck, но, возможно, массив только измеряет фактическое физическое количество пространства, которое было необходимо в любой момент ... (но я не уверен в этом). –

ответ

5

Memcheck предназначен для поиска утечек памяти, поэтому он подсчитывает общее количество всех распределений памяти (и общее количество всех разрядов).

Massif предназначен для просмотра памяти в памяти программы, поэтому он подсчитывает общую память, используемую в каждой точке программы.

Другими словами, если ваша программа выглядит следующим образом:

int main(void) 
{ 
    free(malloc(10*1024)); 
    free(malloc(10*1024)); 
    return 0; 
} 

Тогда Memcheck скажет вам:

total heap usage: 2 allocs, 2 frees, 20,480 bytes allocated 

В то время как массив будет сказать вам это:

-------------------------------------------------------------------------------- 
    n  time(i)   total(B) useful-heap(B) extra-heap(B) stacks(B) 
-------------------------------------------------------------------------------- 
    0    0    0    0    0   0 
    1  130,386   10,248   10,240    8   0 
    2  131,436   10,248   10,240    8   0 
99.92% (10,240B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. 
->99.92% (10,240B) 0x8048407: main (in /home/kevin/miscdev/so/x) 

(На протяжении жизни программы было выделено 20480 байт, но пиковое использование составляло всего 10240 байт).

+0

Для любых будущих зрителей memcheck считает realloc свободным, а затем malloc до его подсчётов free/free, предположительно независимо от реализации realloc. (Я подозреваю, что он захватывает вызов realloc, увеличивает количество отсчетов, а затем вызывает «реальный» realloc, но я не уверен на это на 100%.) – AVB

Смежные вопросы