Windows

Возврат физической памяти и освобождение региона


Для возврата физической памяти, отображенной на регион, или освобождения всего региона адресного пространства используется функция VirtualFree.

BOOL VirtualFree( LPVOID pvAddress, SIZE_T dwSize, DWORD fdwFreeType);

Рассмотрим простейший случай вызова этой функции — для освобождения заре зервированного региона. Когда процессу больше не нужна физическая память, пере данная региону, зарезервированный регион и всю связанную с ним физическую па мять можно освободить единственным вызовом VtrtualFree,

В этом случае в параметр pvAddress надо поместить базовый адрес региона, т. e. значение, возвращенное функцией VirtualAlloc после резервирования данного регио на. Системе известен размер региона, расположенного по указанному адресу, поэто му в параметре dwSize можно передать 0. Фактически Вы даже обязаны это сделать, иначе вылов VirtualFree не даст результата. В третьем параметре (fdwFreeType) пере дайте идентификатор MEM_RELEASE; это приведет к возврату системе всей физичес кой памяти, отображенной на регион, и к освобождению самого региона. Освобож дая регион, Вы должны освободить и зарезервированное под него адресное простран ство. Нельзя выделить регион размером, допустим, 1 28 Кб, а потом освободить толь ко 64 Кб: надо освобождать все 128 Кб.

Если Вам нужно, не освобождая регион, вернуть в систему часть физической па мяти, переданной региону, для этого тоже следует вызвать VirtualFree. При этом ее параметр pvAddress должен содержать адрес, указывающий на первую возвращаемую страницу Кроме того, в параметре dwSize задайте количество освобождаемых байтов, а в параметре fdwFreeType — идентификатор MEM_DECOMMIT.

Как и передача, возврат памяти осуществляется с учетом размерности страниц. Иначе говоря, задание адреса, указывающего на середину страницы, приведет к воз врату всей страницы. Разумеется, то же самое произойдет, если суммарное значение

параметров pvAddress и dwSize выпадет на середину страницы. Так что системе воз вращаются всс страницы, попадающие в диапазон от pvAddress до pvAddress + dwSize. Если же dwSize равен 0, a pvAddress указывает ня базовый адрес выделенного ре гиона, VirtualFree вернет системе весь диапазон выделенных страниц. После возврата физической памяти освобожденные страницы доступны любомудругому процессу, а попытка обращения к адресам, уже не связанным с физической памятью, приведет к нарушению доступа.



Содержание раздела