Шаг 127 - Использование исключений для выделения страниц виртуальной памяти

Идея использования исключений для выделения страниц виртуальной памяти простая. Сначала резервируются страницы. По мере обращения эти страницы заполнятся и к ним есть доступ. Смотрим пример:

#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

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 06.07.2001