VirtualAlloc: функция выделения памяти в Windows
VirtualAlloc является функцией операционной системы Windows, которая выделяет или изменяет размер виртуальной памяти для процесса. Она позволяет динамически выделять блоки памяти и настраивать их атрибуты, такие как защита памяти и тип доступа.
Пример кода:
c++
#include
#include
int main() {
// Выделение 1 МБ виртуальной памяти
LPVOID address = VirtualAlloc(NULL, 1024 * 1024, MEM_COMMIT, PAGE_READWRITE);
if (address == NULL) {
std::cout << "Не удалось выделить виртуальную память!" << std::endl;
return 1;
}
// Запись данных в выделенную память
int* data = static_cast(address);
for (int i = 0; i < 1024 * 1024 / sizeof(int); i++) {
data[i] = i;
}
// Чтение данных из выделенной памяти
for (int i = 0; i < 1024 * 1024 / sizeof(int); i++) {
std::cout << data[i] << " ";
}
std::cout << std::endl;
// Освобождение выделенной памяти
VirtualFree(address, 0, MEM_RELEASE);
return 0;
}
В данном примере кода функция VirtualAlloc используется для выделения блока памяти размером 1 МБ. Если выделение прошло успешно, она возвращает указатель на выделенную память. В противном случае, возвращается NULL.
Затем данные записываются в выделенную память, а затем чтение данных и их вывод на экран. В конце блок памяти освобождается с помощью функции VirtualFree.
`VirtualAlloc` имеет несколько параметров:
- `lpAddress` - указатель на предпочитаемый адрес начала выделения памяти, NULL для автоматического выбора;
- `dwSize` - размер выделяемой памяти в байтах;
- `flAllocationType` - тип выделения памяти, такой как MEM_COMMIT, MEM_RESERVE и MEM_RESET;
- `flProtect` - атрибуты защиты памяти, определяющие права доступа к памяти.
Основные типы выделения памяти:
- `MEM_COMMIT` - выделяет физическую память и связывает её с виртуальной памятью, включая указанное пространство адресов. Байты в сфере адресации выполняемого файла автоматически будут загружены с диска, если они еще не загружены.
- `MEM_RESERVE` - резервирует указанное пространство адресов без какого-либо физического занятия памяти. Виртуальная память, зарезервированная с этим флагом, может использоваться только в коде или резервироваться для наложения на экран (например, графическое окно).
- `MEM_RESET` - сбрасывает состояние выделенной памяти, включая содержимое, атрибуты и все операции памяти. Сброшенная память является невыделенной и вновь обозначена как резерв.
Для работы с выделенной виртуальной памятью используется указатель на тип данных, которые будут храниться в памяти. В данном примере кода это указатель на int. Все данные записываются по индексу в эту память, а затем считываются и выводятся на экран.
Важно отметить, что после использования выделенную виртуальную память необходимо освободить с помощью функции VirtualFree, передав ей указатель на начало блока памяти, размер 0 и флаг MEM_RELEASE. Это предотвратит утечку памяти и вернет память обратно в операционную систему.