Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Создание эффективных приложений для Windows Джеффри Рихтер 2004 (Книга).pdf
Скачиваний:
385
Добавлен:
15.06.2014
Размер:
8.44 Mб
Скачать

памяти сразу жс обновится, как показано ниже Заметьте, что функцию Garbage Collect можно легко использовать в любых других приложениях Я реализовал ее так, чтобы она работала с массивами структур данных любого размера; при этом струк тура не обязательно должна полностью умещаться на странице памяти. Единствен ное требование заключается в том, что первый элемент структуры должен быть зна чением типа BOOL, которое указывает, задействована ли данная структура

И, наконец, хоть это и не видно на экране, закрытие окна приводит к возврату всей переданной памяти и освобождению зарезервированного региона.

Но есть в этой программе еще одна особенность, о которой я пока не упоминал Программе приходится определять состояние памяти в адресном пространстве ре гиона в трех случаях

После изменения индекса. Программе нужно включить кнопку Use и отклю чить кнопку Clear (или наоборот)

В функции сбора мусора. Программа, прежде чем проверять значение флага fInUse, должна определить, была ли передана память.

При обновлении карты памяти Программа должна выяснить, какие страницы свободны, какие — зарезервированы, а какие — переданы

Все эти проверки VMAlloc осуществляет через функцию VirtualQuery, рассмотрен ную в предыдущей главе.

Изменение атрибутов защиты

Хоть это и не принято, но атрибуты защиты, присвоенные странице или страницам переданной физической памяти, можно изменять. Допустим, Вы разработали кол для управления связанным списком, узлы (вершины) которого хранятся в зарезервиро ванном регионе. При желании можно написать функции, которые обрабатывали бы связанные списки и изменяли бы атрибуты защиты переданной памяти при старте на

PAGE_READWRITE, а при завершении — обратно на PAGE_NOACCESS.

Сделав так, Вы защитите данные в связанном списке от возможных «жучков», скры тых в программе Например, если какой то блок кода в Вашей программе из-за нали чия «блуждающего» указателя обратится к данным в связанном списке, возникнет нарушение доступа. Поэтомутакой подход иногда очень полезен — особенно когда пытаешься найти трудноуловимую ошибку в своей программе.

Атрибуты защиты страницы памяти можно изменить вызовом VirtualProtect.