Механизм куч


Куча, – динамически распределяемая память (1Mb), для работы с множеством малых объектов. У каждого процесса существует стандартная куча. Дополнительно программист может создать еще несколько куч.  
DLL использует для своей работы стандартную кучу процесса (по умолчанию), но может использовать и свои кучи, созданные в адресном пространстве процесса. В ОС кучами управляет HeapManager.
Задачи HeapManager:
? Выделение и освобождение физической памяти;
? Слежение за структурностью HEAP.
При инициализации процесса в ого адресном пространстве создается стандартная куча процесса (1Mb). Ее используют по умолчанию многие Win32 функции.
Для многопоточных приложений одновременный доступ к куче запрещается.
Для доступа к стандартной:
1. Создание объекта ядра – «куча»
HANDLE HeapCreate (
DWORD Options, // опции
DWORD IntSize, // начальный размер кучи
DWORD MaxSize); // максимальный размер кучи (0 — динамически)
Опции (Options):
0 – монопольный доступ к куче
HEAP_NO_SERIALIZE – немонопольный доступ к куче
HEAP_GENERATE_EXCEPTIONS – генерить исключение при ошибке
(HEAP_NO_SERIALIZE | HEAP_GENERATE_EXCEPTIONS) – (объединение по «ИЛИ»)
2. Выделение памяти из кучи:
LPVOID HeapAlloc (
HANDLE Heap, // описатель кучи
DWORD Flags, // флаги
DWORD Bytes); // размер в байтах
Флаги (Flags):
HEAP_ZERO_MEMORY – обнулить выделенный блок
HEAP_NO_SERIALIZE – немонопольный доступ к куче
HEAP_GENERATE_EXCEPTIONS – генерить исключение при ошибке
3. Изменение размера области памяти из кучи:
LPVOID HeapRealloc (
DWORD Flags, // флаги
LPVOID Mem, // старый указатель
DWORD NewSize); // новый размер
Флаги (Flags):
HEAP_REALLOC_IN_PLACE_ONLY — изменение размера блока без его перемещения
HEAP_ZERO_MEMORY – обнулить выделенный блок
HEAP_NO_SERIALIZE – немонопольный доступ к куче
HEAP_GENERATE_EXCEPTIONS – генерить исключение при ошибке
4. Освобождение памяти:
BOOL HeapFree (
HANDLE Heap, // описатель кучи
DWORD Flags, // флаги
LPVOID Mem); // старый указатель
Флаги (Flags):
0 – монопольный доступ к куче
HEAP_NO_SERIALIZE – немонопольный доступ к куче
5. Уничтожение кучи:
BOOL HeapDestroy (HANDLE Heap);

Загрузка...