Win32 / MFC: Как найти свободную память (RAM)? - PullRequest
0 голосов
/ 26 марта 2010

Любые предложения / советы / ссылки / учебники будут оценены! :)

Ответы [ 3 ]

9 голосов
/ 26 марта 2010

Там действительно нет ответа на это. При нормальных обстоятельствах ОС будет хранить что-то практически во всей памяти системы. По сути, когда он читает что-то в память, он будет хранить его копию в памяти, пока что-то еще не будет нуждаться в памяти, так что первое будет удалено. Есть ряд функций, которые могут получить информацию о памяти, но ни одна из них даже не пытается действительно вернуть объем памяти, который полностью не используется. Самый близкий из известных мне GlobalMemoryStatusEx, который возвращает число для объема доступной памяти.

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

Если вам нужна более подробная информация, вы можете использовать такие вещи, как VirtualQueryEx, чтобы получить ее, но обычно она перегружает вас информацией, сообщающей вам о каждом блоке памяти, используемом в данном процессе вместо того, чтобы давать красивое, простое число, говорящее "x байтов свободно".

5 голосов
/ 26 марта 2010

GlobalMemoryStatus / GlobalMemoryStatusEx

http://msdn.microsoft.com/en-us/library/aa366586(VS.85).aspx

3 голосов
/ 26 марта 2010

Это довольно легко ответить, свободная память всегда достаточно близка к 0, чтобы считать ее нулевой и не беспокоить. Неиспользуемая ОЗУ всегда используется кешем файловой системы, вы можете увидеть это в Taskmgr.exe, вкладка «Производительность».

Если вы на самом деле имеете в виду «свободную виртуальную память», число, которое вас действительно волнует, тогда ответ «на самом деле невозможно». Вам понадобится HeapWalk (), очень неудобная и опасная функция для использования. Только HeapWalk может обнаруживать блоки в куче, которые помечены как свободные, но все еще отображаются. Число, к которому вы пришли, в любом случае не имеет смысла. В программе никогда не заканчиваются свободные блоки виртуальной памяти, вначале всегда заканчиваются достаточно большие блоки памяти.

Обнаружить это состояние достаточно просто. Malloc возвращает NULL, новый оператор выдает std :: bad_alloc. Разобраться с этим условием нелегко. Решение проблемы занимает менее двухсот долларов, что примерно равно стоимости лицензии на 64-разрядную версию Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...