Составители:
Рубрика:
размер кучи. Последующие выделения памяти приводят к увеличению или
уменьшению объема кучи. Если для очередного выделения памяти потребуют-
ся новые страницы, команды для работы с кучей автоматически закрепят их.
Страницы остаются закрепленными до тех пор, пока куча не будет уничтожена
или пока сама программа не завершится.
Система не может управлять содержимым локальной кучи, уплотнять ку-
чу или перемещать объекты внутри нее. Поэтому не исключено, что после
многократного выделения и освобождения большого количества мелких объ-
ектов куча станет фрагментированной. Если при очередном выделении памяти
куча достигает максимального размера, все последующие выделения не со-
вершаются. Однако если аргумент dwMaximumSize равен 0, размер кучи огра-
ничивается объемом доступной памяти.
Параметр dwOptions позволяет установить один-единственный флаг –
HEAP_NO_SERIALIZE.
По умолчанию без этого флага (значение аргумента
равно 0) куча не допускает взаимодействия посредством потоков, которые
совместно используют дескрипторы памяти. Сериализованная куча препят-
ствует одновременному выполнению нескольких операций с одним дескрип-
тором. Один из потоков блокируется до тех пор, пока другой поток не за-
вершит выполнение своей операции. Сериализация несколько снижает
быстродействие. Если в программе реализован только один поток, если
только один из нескольких потоков программы обращается к куче или если
программа самостоятельно обеспечивает защиту кучи (например, путем соз-
дания исключающего семафора или критического раздела), сериализация
кучи не требуется.
Функции HeapAlloc(), HeapReAlloc() и HeapFree() осуществляют выделе-
ние, повторное выделение и освобождение блоков памяти из кучи. Все эти
функции в качестве одного из аргументов принимают дескриптор, возвращен-
ный функцией HeapCreate():
LPSTR HeapAlloc
(HANDLE hHeap, // дескриптор локальной кучи
DWORD dwFlags, // управляющие флаги
DWORD dwBytes, // количество выделяемых байтов);…
Функция HeapAlloc() возвращает указатель блока необходимого размера.
Ей могут быть переданы два управляющих флага:
HEAP_GENERATE_EXCEPTIONS определяет, как команда будет
обрабатывать ошибки. Если он не установлен, функция HeapAlloc() сооб-
щает об ошибке, возвращая значение NULL.
Если флаг установлен, то в
ответ на любую ошибку функция порождает исключение;
HEAP_ZERO_MEMORY дает функции HeapAlloc() указание инициа-
лизировать новый выделенный блок, заполняя его нулями. При успешном
выполнении функция выделяет столько памяти, сколько требуется, или
немного больше, чтобы достичь ближайшей границы страницы.
Чтобы узнать точный размер любого блока, необходимо вызвать функцию
55
размер кучи. Последующие выделения памяти приводят к увеличению или
уменьшению объема кучи. Если для очередного выделения памяти потребуют-
ся новые страницы, команды для работы с кучей автоматически закрепят их.
Страницы остаются закрепленными до тех пор, пока куча не будет уничтожена
или пока сама программа не завершится.
Система не может управлять содержимым локальной кучи, уплотнять ку-
чу или перемещать объекты внутри нее. Поэтому не исключено, что после
многократного выделения и освобождения большого количества мелких объ-
ектов куча станет фрагментированной. Если при очередном выделении памяти
куча достигает максимального размера, все последующие выделения не со-
вершаются. Однако если аргумент dwMaximumSize равен 0, размер кучи огра-
ничивается объемом доступной памяти.
Параметр dwOptions позволяет установить один-единственный флаг –
HEAP_NO_SERIALIZE. По умолчанию без этого флага (значение аргумента
равно 0) куча не допускает взаимодействия посредством потоков, которые
совместно используют дескрипторы памяти. Сериализованная куча препят-
ствует одновременному выполнению нескольких операций с одним дескрип-
тором. Один из потоков блокируется до тех пор, пока другой поток не за-
вершит выполнение своей операции. Сериализация несколько снижает
быстродействие. Если в программе реализован только один поток, если
только один из нескольких потоков программы обращается к куче или если
программа самостоятельно обеспечивает защиту кучи (например, путем соз-
дания исключающего семафора или критического раздела), сериализация
кучи не требуется.
Функции HeapAlloc(), HeapReAlloc() и HeapFree() осуществляют выделе-
ние, повторное выделение и освобождение блоков памяти из кучи. Все эти
функции в качестве одного из аргументов принимают дескриптор, возвращен-
ный функцией HeapCreate():
LPSTR HeapAlloc
(HANDLE hHeap, // дескриптор локальной кучи
DWORD dwFlags, // управляющие флаги
DWORD dwBytes, // количество выделяемых байтов);…
Функция HeapAlloc() возвращает указатель блока необходимого размера.
Ей могут быть переданы два управляющих флага:
HEAP_GENERATE_EXCEPTIONS определяет, как команда будет
обрабатывать ошибки. Если он не установлен, функция HeapAlloc() сооб-
щает об ошибке, возвращая значение NULL. Если флаг установлен, то в
ответ на любую ошибку функция порождает исключение;
HEAP_ZERO_MEMORY дает функции HeapAlloc() указание инициа-
лизировать новый выделенный блок, заполняя его нулями. При успешном
выполнении функция выделяет столько памяти, сколько требуется, или
немного больше, чтобы достичь ближайшей границы страницы.
Чтобы узнать точный размер любого блока, необходимо вызвать функцию
55
Страницы
- « первая
- ‹ предыдущая
- …
- 53
- 54
- 55
- 56
- 57
- …
- следующая ›
- последняя »
