2015-02-20 3 views
1

Существует код C++, который выполняет некоторые вычисления в итерациях цикла. Когда я запускаю свой код на пару часов, увеличение использования памяти не наблюдается. Но когда я позволяю ей работать в ночное время, 50 МБ увеличения использования памяти наблюдается с помощью инструмента MS Performance Monitor (perfmon.exe), как показано ниже. Сюжеты предназначены только для моего процесса, а не для всей системы.Возможно ли увеличение использования памяти моего кода без утечки памяти?

enter image description here

Visual Leak Detector не может обнаружить любую утечку памяти внутри реализуемого цикла. Возможно ли, что причиной увеличения использования памяти является нечто иное, чем утечка памяти?

+1

Да; возможно. У вас могут быть списки или другая структура данных, которые растут - вы не удаляете элементы, чтобы список продолжал расти. Меньше вероятность утечки памяти, где есть циклы ссылок между просочими элементами, поэтому детектор утечки не обнаруживает, что есть утечка. –

+2

Я вижу две возможности: либо VLD пропустил утечку памяти (что на самом деле может случиться), либо ваш код фактически увеличивает использование памяти (для этого не требуется утечка памяти, утечка памяти происходит, когда вы не можете ссылаться на некоторая память больше и, следовательно, не может ее выпустить, но вы также можете просто сохранить больше памяти по мере запуска программы). – JBL

+0

Является ли эта информация конкретно о вашей программе или о всей системе? Если это системный граф, могут выполняться другие задачи или программы, которые используют больше памяти. –

ответ

1

Визуальный детектор утечки может быть обманут шаблонами использования памяти, которые выглядят законными, а на самом деле они не являются. Например, если вы продолжаете выделять некоторые вещи и не только забываете их освобождать, но и сохраняете указатели на них в списке, это выглядит как обычное использование памяти, насколько может сказать любой немой инструмент.

Кроме того, 50 МБ не являются таким огромным объемом памяти для настольного приложения, о котором нужно беспокоиться, и в любом случае ваши наблюдения слишком ограничены, чтобы иметь возможность делать какие-либо выводы. Может случиться так, что диспетчер памяти вашей среды выполнения C++ считает, что эти арахис размером 50 Мбайт стоит жертвовать своей эффективностью, поэтому он может выбрать, чтобы не беспокоиться о слиянии смежных свободных блоков, чтобы удовлетворить запросы на распределение при наличии более свежей доступной памяти ОС. Чтобы лучше теоретировать о том, что происходит, вам нужно показать более полный график распределения памяти вашего приложения с течением времени. Это непрерывный прямой склон? Это склона, которая в какой-то момент превратилась в плоскую линию? У него есть какой-то неожиданный ступень? Это уклон, который продолжает расти даже после того, как вы полностью исчерпали физическую память и начали пейджинг?