2013-10-10 2 views
2

На работе я пишу довольно сложную часть программного обеспечения на C, и я часто тестирую ее с помощью valgrind. Программа до сих пор отлично работает без утечек памяти или нарушений границ массива, а в отчете valgrind количество «frees» соответствует количеству «mallocs» - отлично. Меня беспокоит то, что он сообщает о тысячах frees и mallocs. И я знаю, что я не делаю больше, чем около 50-60. Я знаю, что когда моя программа вызывает «fopen», этот вызов подсчитывается valgrind по отношению к числу mallocs, и аналогично «fclose» подсчитывается по отношению к числу «frees». Но в моем случае это все еще не объясняет числа, которые я вижу, сколько раз память и освобождение памяти. Я тщательно изучил свой код, тщательно искал виновника, но ничего не получил. Я не могу публиковать какой-либо код по понятным причинам, но я просто хочу знать, я что-то упустил? Существуют ли другие операции C, которые valgrind подсчитывает по отношению к числу mallocs и frees?Что все операции C делают valgrind как «malloc» и «free»?

Вот мой отчет о 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) 
+3

Как насчет 'for (int i = 0; i! = 10000; ++ i) {free (malloc (1)); } '? –

+5

Если вы вызываете подпрограммы библиотеки C или связываетесь с любыми библиотеками и вызываете их, они могут вызывать malloc() и free(). –

+0

Вы используете библиотеки? Часто они выделяют и освобождают память за кулисами. – Pankrates

ответ

0

Ну, если вы вызываете библиотечные функции, выполняющие malloc и бесплатные звонки, вы увидите много распределений и освобождений. некоторые из функций библиотеки, системные вызовы, которые выполняют выделение, - это strdup, pthread_create, timer_create и т. д.

0

Помните, что есть много вызовов функций, которые могут выделять память, strdup, fopen, создавать потоки, загружать общие объекты, время разбора или информацию о локали (поскольку может потребоваться функция, связанная со временем), библиотеки партий 3.d могут выделять память несколькими способами и т. д.

Но, запустить программу с помощью инструмента Valgrind массива, http://valgrind.org/docs/manual/ms-manual.html (читать эти документы)

например

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: [email protected]@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%)