С помощью данной функции есть возможность выделить или зарезервировать страницы виртуальной памяти. Между выделением и резервированием есть разница. При выделении физически выделяется память и естественно увеличивается файл подкачки. При резервировании этого не происходит. Вот она:
LPVOID VirtualAlloc
(
LPVOID lpAddress,// базовые адрес
SIZE_T dwSize,// размер
DWORD flAllocationType,// способ получения
DWORD flProtect// тип доступа
);
lpAddress - задает начальный адрес. При этом адрес округляется до ближайшей границы блока размером 64 Кбайт. Это значение можно задать NULL и тогда операционная система сама выберет этот адрес.
DwSize - размер памяти. Но эта величина очень специфичная. Память выделяется блоками по 4096 байт и соответственно указанный размер будет округляться до этого числа. Выделяете память например 10 байт, а получите 4096, а если выделяете например 5000, то будет выделено памяти в 8192 байта. Округление естественно идет в сторону увеличения.
FlAllocationType - способ получения, он может быть следующим:
- MEM_COMMIT - Выполняется выделение страниц памяти для непосредственной работы с ними. Выделенные страницы заполняются нулями.
- MEM_TOP_DOWN - Память выделяется в области верхних адресов адресного пространства приложения.
Как видите мы можем получить память, зарезервировать.
FlProtect - устанавливает тип доступа:
- PAGE_READWRITE - Чтение и запись.
- PAGE_READONLY - Только чтение.
- PAGE_EXECUTE - Только исполнение программного кода.
- PAGE_EXECUTE_READ - Исполнение и чтение.
- PAGE_EXECUTE_READWRITE - Исполнение, чтение и запись.
- PAGE_NOACCESS - Запрещен любой вид доступа.
- PAGE_GUARD - Сигнализация доступа к странице. Это значение можно использовать вместе с любыми другими, кроме PAGE_NOACCESS.
- PAGE_NOCACHE - Отмена кэширования для страницы памяти. Используется драйверами устройств. Это значение можно использовать вместе с любыми другими, кроме PAGE_NOACCESS.
При успешном выполнении функция вернет указатель на выделенную память, иначе NULL.
Функция VirtualFree освобождает выделенную память.
BOOL VirtualFree
(
LPVOID lpAddress,// адресс памяти
SIZE_T dwSize,// рамер памяти
DWORD dwFreeType// операция
);
dwSize - размер, если мы будем использовать тип освобождения, как MEM_RELEASE, то размер должен быть установлен в 0.
dwFreeType - будет определять какая операция произойдет с памятью:
- MEM_RELEASE - освобождена
- MEM_DECOMMIT - зарезервированные, но не используемые.
При успешном выполнении функция вернет ненулевое значение.
Давайте посмотрим пример.
// testAlloc.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
#define MEMSIZE 4000
void main()
{
void *p=NULL;
p=VirtualAlloc(NULL,MEMSIZE,MEM_RESERVE,PAGE_READWRITE);
if (p!=NULL)
{
cout << "OK Alloc " << endl;
if (VirtualFree(p,0,MEM_RELEASE))
cout << "Ok Free";
else
cout << "Not Free" << endl;
}
else
cout << "Error Alloc " << endl;
}