Эти цифры нельзя сравнивать по-настоящему. Даже страницы, относящиеся к (совместно используемому) отображенному в памяти файлу (например, библиотеке), будут считаться резидентными страницами для задачи. Но они будут проигнорированы тестером на утечку.
Важно отметить, что существует концептуальная разница между памятью, доступной для процесса (любым способом: только для чтения, для чтения / записи, исполняемой или нет) и памятью, выделенной вами, в вашей программе. Не вся доступная память связана с фактическим распределением, которое вы сделали (например, с общей библиотекой), и не вся выделенная вами память обязательно находится в памяти (например, большой malloc не зарезервирует для вас физическую память сразу, а только сразу используется).
Вы можете проверить влияние этого, сопоставив анонимную область памяти (или файл), используя:
#include <sys/mman.h>
// allocate anonymous region of memory (1 mb)
char *p = mmap(NULL,1024*1024,PROT_WRITE|PROT_READ,MAP_PRIVATE|MAP_ANON,0,0);
// actually access the memory, or it will not be resident
int sum=0;
for(int i=0;i<1024*1024;i++ ) sum += p[i];
Вы можете легко изменить это на mmap
файл, передав fd к mmap
и изменив MAP_ANON
на MAP_FILE
.
Кроме того, предположительно, тестер утечки просматривает вызов malloc
(библиотека) и далее до соответствующего free
, в то время как фактическое резервирование памяти выполняется только на один уровень ниже, например, используя mmap
(системный) вызов, как и выше.