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