2016-04-26 6 views
2

Я работаю над программой поиска шаблонов, которая постоянно выделяет и освобождает от кучи. Программа предназначена для того, чтобы быть очень внимательным к использованию памяти, поэтому, когда я закончил с памятью, ее необходимо освободить для ОС. С учетом сказанного я провел обширное обнаружение утечки памяти и обнаружил все утечки, которые появляются в журнале дампа 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. Спасибо!

+0

У вас есть глобальные или локальные переменные? Они не разрушаются до тех пор, пока функция «main» не вернется (т. Е. После проверки). Также, может быть, сумма, которую вы получите, также включает исполняемую программу и все сопоставленные DLL-файлы? И это, кроме ответа от Джона Звинка. –

+3

Это способ распределения памяти. Когда вы освобождаете память, он становится доступным для перераспределения в рамках одного и того же процесса, но он не возвращается обратно в ОС до тех пор, пока процесс не завершится. Но это также в значительной степени не проблема в современной операционной системе с виртуальной памятью, поскольку большая часть этой неиспользуемой памяти, связанной с вашим процессом, в конечном итоге будет заменена, если есть какое-либо давление на физическую память. Но эта память полностью * освобождается при выходе программы. –

+0

@JohnBollinger Это похоже на ответ, а не на комментарий. – NathanOliver

ответ

4

Просто потому, что вы свободная память не означает, что она немедленно возвращается в операционную систему. У вашей стандартной библиотеки, вероятно, есть куча памяти, которую она получила от ОС, но которая не используется в вашей программе. Это не утечка памяти, и на практике это обычно не проблема.

+0

Скажем, например, я хочу запустить программу, которая может одновременно иметь только 4 ГБ, и эта память увеличивается и увеличивается с течением времени. В конце концов у меня не будет достаточно памяти для запуска моей программы. Характер моей программы заключается в том, что она может работать в течение нескольких дней за раз, и я боюсь, что освобождение памяти, выпущенной в ОС, не приведет к возможному подкачке ... – PeterMorley

+1

@ user3734523 Свободная память может по-прежнему оставаться * сопоставленной * с вашей процесс, это не значит, что он недоступен для других процессов. Если операционные системы сочтут это необходимым, оно отменит страницы из вашего процесса и передаст другим процессам. –

+1

@ user3734523: Это то, что лучше не беспокоиться о слишком большом количестве заранее. Напишите свой код, запустите его и посмотрите, какие у вас проблемы. Тогда решите их. –