С помощью данной функции есть возможность выделить или зарезервировать страницы виртуальной памяти. Между выделением и резервированием есть разница. При выделении физически выделяется память и естественно увеличивается файл подкачки. При резервировании этого не происходит. Вот она:
LPVOID VirtualAlloc ( LPVOID lpAddress, // базовые адрес SIZE_T dwSize, // размер DWORD flAllocationType, // способ получения DWORD flProtect // тип доступа );
lpAddress - задает начальный адрес. При этом адрес округляется до ближайшей границы блока размером 64 Кбайт. Это значение можно задать NULL и тогда операционная система сама выберет этот адрес.
DwSize - размер памяти. Но эта величина очень специфичная. Память выделяется блоками по 4096 байт и соответственно указанный размер будет округляться до этого числа. Выделяете память например 10 байт, а получите 4096, а если выделяете например 5000, то будет выделено памяти в 8192 байта. Округление естественно идет в сторону увеличения.
FlAllocationType - способ получения, он может быть следующим:
Как видите мы можем получить память, зарезервировать.
FlProtect - устанавливает тип доступа:
При успешном выполнении функция вернет указатель на выделенную память, иначе NULL.
Функция VirtualFree освобождает выделенную память.
BOOL VirtualFree ( LPVOID lpAddress, // адресс памяти SIZE_T dwSize, // рамер памяти DWORD dwFreeType // операция );
dwSize - размер, если мы будем использовать тип освобождения, как MEM_RELEASE, то размер должен быть установлен в 0.
dwFreeType - будет определять какая операция произойдет с памятью:
При успешном выполнении функция вернет ненулевое значение.
Давайте посмотрим пример.
// 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; }