Идея использования исключений для выделения страниц виртуальной памяти простая. Сначала резервируются страницы. По мере обращения эти страницы заполнятся и к ним есть доступ. Смотрим пример:
#include "stdafx.h" #include "windows.h" #include "iostream.h" struct MemItem { int a; }; // указатель на резервируемую память int* m_pVirtualAlloc; // размер структуры const sizestruct=sizeof(MemItem); void Access(int index,int data); void Printdata(int index); void main() { // выделение памяти m_pVirtualAlloc=(int*)VirtualAlloc( NULL, //ОС выберет начало sizestruct*2500, //для структур MEM_RESERVE, //резервирование PAGE_NOACCESS //без доступа ); // проверка инициализации if (m_pVirtualAlloc!=NULL) { // доступ Access(1,10); Printdata(1); Access(1,20); Printdata(1); Access(2000,12); cout << "finish" << endl; Printdata(1); Printdata(2000); // освободить VirtualFree(m_pVirtualAlloc,0,MEM_RELEASE); } else cout << "Error Alloc" << endl; } void Access(int index,int data) { __try { MemItem* mi=(MemItem*)m_pVirtualAlloc+index*sizestruct; mi->a=data; } __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION) { cout << "Not Access" << endl; VirtualAlloc(m_pVirtualAlloc+index*sizestruct, sizestruct,MEM_COMMIT,PAGE_READWRITE); MemItem* mi=(MemItem*)m_pVirtualAlloc+index*sizestruct; mi->a=data; } } void Printdata(int index) { __try { MemItem* mi=(MemItem*)m_pVirtualAlloc+index*sizestruct; cout << mi->a << endl; } __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION) { cout << "Not Print" << endl; } }
Если при попытки обращения к странице получаем EXCEPTION_ACCESS_VIOLATION то ее нужно заполнить. Дальше обращения к ней будут нормальные. Данное исключение будет сгенерированно только один раз. Использовать данный пример можно было например для заполнения памяти из файла по мере обращения к данным или для заполнения массива.
Смотрим результат:
Not Access 10 20 Not Access finish 20 12 Press any key to continue