Доступная память означает, что на нее указывает глобальный или статический указатель. Что вы хотите сделать, так это запустить valgrind с --show-reachable=yes
, чтобы увидеть, является ли это проблемой.
Часто это безвредно и происходит от такой функции:
void foo()
{
static char *buffer = 0;
if (buffer == 0)
{
buffer = (char *)malloc(...);
}
}
Этот мальлок все еще будет доступен. Но независимо от того, сколько раз вызывается foo, вы выделяете буфер ровно один раз, поэтому здесь нет никакого вреда, если вы его не освободите.
Но рассмотрим функцию, подобную этой:
void foo()
{
static node_t *head = 0;
node_t *node = (node_t *)malloc(sizeof(node_t));
if (node)
{
node->next = head;
head = node;
}
...
}
Каждый раз, когда вызывается эта функция, выделяется другой узел. Несмотря на то, что вы можете использовать только несколько узлов для тестовых прогонов, в производственном цикле вы можете протечь достаточно, чтобы у вас не хватило памяти.
Один из способов определить разницу - это посмотреть, всегда ли разные прогоны пропускают одну и ту же память или вы теряете больше памяти - это тестовые прогоны с большими входами.
Но опять же, если вы хотите быть в безопасности, используйте --show-reachable=yes
и посмотрите, что происходит.