Существует более одного способа определения «утечки памяти». В частности, есть два основных определения «утечки памяти», которые широко используются программистами.
Первое обычно используемое определение «утечки памяти»: «Память была выделена и впоследствии не была освобождена до завершения программы». Тем не менее, многие программисты (справедливо) утверждают, что некоторые типы утечек памяти, которые соответствуют этому определению, на самом деле не создают никаких проблем, и поэтому не должны рассматриваться как true «утечки памяти».
Возможно, более строгое (и более полезное) определение «утечки памяти» таково: «Память была выделена, и не может быть впоследствии освобождена, поскольку у программы больше нет указателей на выделенный блок памяти». Другими словами, вы не можете освободить память, на которую у вас больше нет указателей. Следовательно, такая память является «утечкой памяти». Valgrind использует это более строгое определение термина «утечка памяти». Это тип утечки, который потенциально может привести к значительному истощению кучи, особенно для долгоживущих процессов.
Категория «все еще достижимая» в отчете об утечке Valgrind относится к выделениям, которые соответствуют только первому определению «утечки памяти». Эти блоки не были освобождены, но они могли быть освобождены (если бы программист захотел), потому что программа все еще отслеживала указатели на эти блоки памяти.
В общем, нет необходимости беспокоиться о «все еще доступных» блоках. Они не представляют собой проблему, которую могут вызвать утечки памяти true . Например, обычно нет возможности исчерпать кучу из «все еще доступных» блоков. Это связано с тем, что эти блоки обычно являются одноразовыми, ссылки на которые хранятся в течение всего времени жизни процесса. Несмотря на то, что вы могли бы пройти и убедиться, что ваша программа освобождает всю выделенную память, это обычно не дает практической пользы, поскольку операционная система в любом случае восстановит всю память процесса после его завершения. Сравните это с true утечками памяти, которые, если оставить их нефиксированными, могут привести к тому, что процессу не хватит памяти, если он останется работать достаточно долго, или просто заставят процесс использовать намного больше памяти, чем необходимо.
Вероятно, единственное время, когда полезно убедиться, что все распределения имеют совпадающие "освобождения", - это если ваши инструменты обнаружения утечек не могут определить, какие блоки "еще доступны" (но Valgrind может это сделать) или если ваша операционная система не восстановить всю память завершающего процесса (все платформы, для которых Valgrind был перенесен для этого).