Идея использования исключений для выделения страниц виртуальной памяти простая. Сначала резервируются страницы. По мере обращения эти страницы заполнятся и к ним есть доступ. Смотрим пример:
#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