Составители:
третьих, к увеличению на единицу значения счетчика блокирований данного блока.
Дальнейшая работа с блоком проводится обычным образом через полученный
указатель. Когда текущая работа с блоком заканчивается его нужно снова
разблокировать (вызвав функцию GlobalUnlock). Отбрасываемые блоки памяти
(только Win16) отдают Windows полный контроль над блоком. При необходимости
эти блоки могут уничтожаться самой ОС. Если
затем они понадобятся в программе
их нужно создавать вновь. В этом случае необходимо перед использованием блока
проверять "жив" он или нет (если нет, то GlobalLock вернет NULL).
Отбрасываемые блоки обязательно должны объявляться также и перемещаемыми.
В общем случае для динамического распределения памяти можно
использовать функции стандартной библиотеки Си, операции C++ или
специальные функции
из MS Windows API.
1). Использование функций стандартной библиотеки Си.
Фиксированные блоки памяти можно динамически захватывать с помощью
стандартных функций Си (прототипы в файле stdlib.h):
void *malloc(UINT size);
void *calloc(UINT elem_count, UINT elem_size);
void *realloc(void *old_ptr, UINT new_size);
void free(void *ptr);
Техника работы с динамической памятью в этом случае та же, что и при
программировании в MS DOS. Отличия связаны лишь с вопросом о
поддерживаемой модели памяти: сегментированная (ближние, дальние
указатели)
или с прямой 32-разрядной адресацией. Старые модели Windows (до Windows 95)
поддерживали сегментированную модель памяти. В этом случае, как и для MS
DOS, размер сегмента не может превышать 64K. При использовании прямой 32-
разрядной адресации, программа может непосредственно обращаться к любой
ячейке виртуальной памяти в пределах доступных 4 гигабайт (2
32
). На самом деле
программа для собственных нужд может использовать лишь половину этого
адресного пространства. Остальную часть Windows "... использует в системных
целях".
2). Использование операций С++.
Операции new и delete можно использовать вместо стандартных функций Си
для динамического захвата фиксированных блоков памяти.
3). Функции из WinAPI.
Windows API содержит набор функций для работы как с фиксированными,
так и перемещаемыми и удаляемыми (отбрасываемыми) блоками памяти.
Некоторые функции приведены в следующей таблице, взятой из [2].
Имя функции Описание
CopyMemory Копирование блока памяти
FillMemory Заполняет блок памяти заданными значениями
GlobalAlloc, LocalAlloc Выделяет блок памяти заданного размера
GlobalDiscard, LocalDiscard Отбрасывает выделенный блок памяти
GlobalFlags, LocalFlags Возвращает флаги, соотв-е блоку памяти
третьих, к увеличению на единицу значения счетчика блокирований данного блока. Дальнейшая работа с блоком проводится обычным образом через полученный указатель. Когда текущая работа с блоком заканчивается его нужно снова разблокировать (вызвав функцию GlobalUnlock). Отбрасываемые блоки памяти (только Win16) отдают Windows полный контроль над блоком. При необходимости эти блоки могут уничтожаться самой ОС. Если затем они понадобятся в программе их нужно создавать вновь. В этом случае необходимо перед использованием блока проверять "жив" он или нет (если нет, то GlobalLock вернет NULL). Отбрасываемые блоки обязательно должны объявляться также и перемещаемыми. В общем случае для динамического распределения памяти можно использовать функции стандартной библиотеки Си, операции C++ или специальные функции из MS Windows API. 1). Использование функций стандартной библиотеки Си. Фиксированные блоки памяти можно динамически захватывать с помощью стандартных функций Си (прототипы в файле stdlib.h): void *malloc(UINT size); void *calloc(UINT elem_count, UINT elem_size); void *realloc(void *old_ptr, UINT new_size); void free(void *ptr); Техника работы с динамической памятью в этом случае та же, что и при программировании в MS DOS. Отличия связаны лишь с вопросом о поддерживаемой модели памяти: сегментированная (ближние, дальние указатели) или с прямой 32-разрядной адресацией. Старые модели Windows (до Windows 95) поддерживали сегментированную модель памяти. В этом случае, как и для MS DOS, размер сегмента не может превышать 64K. При использовании прямой 32- разрядной адресации, программа может непосредственно обращаться к любой ячейке виртуальной памяти в пределах доступных 4 гигабайт (232). На самом деле программа для собственных нужд может использовать лишь половину этого адресного пространства. Остальную часть Windows "... использует в системных целях". 2). Использование операций С++. Операции new и delete можно использовать вместо стандартных функций Си для динамического захвата фиксированных блоков памяти. 3). Функции из WinAPI. Windows API содержит набор функций для работы как с фиксированными, так и перемещаемыми и удаляемыми (отбрасываемыми) блоками памяти. Некоторые функции приведены в следующей таблице, взятой из [2]. Имя функции Описание CopyMemory Копирование блока памяти FillMemory Заполняет блок памяти заданными значениями GlobalAlloc, LocalAlloc Выделяет блок памяти заданного размера GlobalDiscard, LocalDiscard Отбрасывает выделенный блок памяти GlobalFlags, LocalFlags Возвращает флаги, соотв-е блоку памяти
Страницы
- « первая
- ‹ предыдущая
- …
- 4
- 5
- 6
- 7
- 8
- …
- следующая ›
- последняя »