Я работаю над программой поиска по шаблону, которая постоянно выделяет и освобождает из кучи. Программа предназначена для осознанного использования памяти, поэтому, когда я закончу с памятью, ее нужно освободить для ОС. С учетом вышесказанного я провел обширное обнаружение утечек памяти и обнаружил все утечки, которые появляются в журнале дампов CRT, с некоторой помощью визуального детектора утечек из Visual Studio и WinDbg для отслеживания стека.
Основная проблема заключается в том, что чем больше операций с кучей происходит при обработке файла, тем больше у меня остается этого куска памяти, который не освобождается ОС, но при этом он не отображается как утечка после завершения программы. Я хватаю использование ресурсов программы, используя следующие строки кода:
PROCESS_MEMORY_COUNTERS pmc;
GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
PListType physMemUsedByMe = pmc.WorkingSetSize;
return physMemUsedByMe/1000000.0f;
Это возвращает объем памяти в МБ, который использует программа, и я делаю этот вызов прямо перед выходом из программы. У меня могут быть нулевые утечки памяти, но до 500 МБ этих оставшихся данных. Не уверен, что этот материал как-то сидит в стеке или это фрагментация кучи? Я использую карты и векторы STL, но очищаю их правильно, если использую указатели.
Я занимался детективной работой довольно давно, и я действительно не придумываю ответы на таких форумах, как этот, поэтому я хотел задать свой вопрос специально. Любая помощь имеет большое значение. Не имеет значения, если я просто предположение, мне просто нужно провести мозговой штурм за пределами моей собственной головы LOL. Спасибо!
Только то, что вы освобождаете память, не означает, что она немедленно возвращается в операционную систему. Ваша стандартная библиотека, скорее всего, имеет кучу памяти, которую она получила от ОС, но которая не используется в вашей программе. Это не утечка памяти, и на практике это обычно не проблема.
Других решений пока нет …