|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
HeapCreate
The HeapCreate function creates a heap object that can be used by the calling process. The function reserves a contiguous block in the virtual address space of the process and allocates physical storage for a specified initial portion of this block.
HANDLE HeapCreate(
DWORD flOptions, // heap allocation flag DWORD dwInitialSize, // initial heap size DWORD dwMaximumSize // maximum heap size );
Parameters
flOptions
Specifies optional attributes for the new heap. These flags will affect subsequent access to the new heap through calls to the heap functions (HeapAlloc, HeapFree, HeapReAlloc, and HeapSize). You can specify one or more of the following flags:
Flag Meaning HEAP_GENERATE_EXCEPTIONS Specifies that the system will raise an exception to indicate a function failure, such as an out-of-memory condition, instead of returning NULL. HEAP_NO_SERIALIZE Specifies that mutual exclusion will not be used when the heap functions allocate and free memory from this heap. The default, occurring when the HEAP_NO_SERIALIZE flag is not specified, is to serialize access to the heap. Serialization of heap access allows two or more threads to simultaneously allocate and free memory from the same heap.
dwInitialSize
Specifies the initial size, in bytes, of the heap. This value determines the initial amount of physical storage that is allocated for the heap. The value is rounded up to the next page boundary. To determine the size of a page on the host computer, use the GetSystemInfo function.
dwMaximumSize
If dwMaximumSize is a nonzero value, it specifies the maximum size, in bytes, of the heap. The HeapCreate function rounds dwMaximumSize up to the next page boundary, and then reserves a block of that size in the process's virtual address space for the heap. If allocation requests made by the HeapAlloc or HeapReAlloc functions exceed the initial amount of physical storage specified by dwInitialSize, the system allocates additional pages of physical storage for the heap, up to the heap's maximum size.
In addition, if dwMaximumSize is nonzero, the heap cannot grow, and an absolute limitation arises: the maximum size of a memory block in the heap is a bit less than 0x7FFF8 bytes. Requests to allocate larger blocks will fail, even if the maximum size of the heap is large enough to contain the block. If dwMaximumSize is zero, it specifies that the heap is growable. The heap's size is limited only by available memory. Requests to allocate blocks larger than 0x7FFF8 bytes do not automatically fail; the system calls VirtualAlloc to obtain the memory needed for such large blocks. Applications that need to allocate large memory blocks should set dwMaximumSize to zero.
Return Values
If the function succeeds, the return value is a handle of the newly created heap. If the function fails, the return value is is NULL. To get extended error information, call GetLastError.
Remarks
The HeapCreate function creates a private heap object from which the calling process can allocate memory blocks by using the HeapAlloc function. The initial size determines the number of committed pages that are initially allocated for the heap. The maximum size determines the total number of reserved pages. These pages create a contiguous block in the process's virtual address space into which the heap can grow. If requests by HeapAlloc exceed the current size of committed pages, additional pages are automatically committed from this reserved space, assuming that the physical storage is available.
The memory of a private heap object is accessible only to the process that created it. If a dynamic-link library (DLL) creates a private heap, the heap is created in the address space of the process that called the DLL, and it is accessible only to that process. The system uses memory from the private heap to store heap support structures, so not all of the specified heap size is available to the process. For example, if the HeapAlloc function requests 64 kilobytes (K) from a heap with a maximum size of 64K, the request may fail because of system overhead.
If the HEAP_NO_SERIALIZE flag is not specified (the simple default), the heap will serialize access within the calling process. Serialization ensures mutual exclusion when two or more threads attempt to simultaneously allocate or free blocks from the same heap. There is a small performance cost to serialization, but it must be used whenever multiple threads allocate and free memory from the same heap. Setting the HEAP_NO_SERIALIZE flag eliminates mutual exclusion on the heap. Without serialization, two or more threads that use the same heap handle might attempt to allocate or free memory simultaneously, likely causing corruption in the heap. The HEAP_NO_SERIALIZE flag can, therefore, be safely used only in the following situations:
· The process has only one thread. · The process has multiple threads, but only one thread calls the heap functions for a specific heap. · The process has multiple threads, and the application provides its own mechanism for mutual exclusion to a specific heap.
See Also
GetProcessHeap, GetProcessHeaps, GetSystemInfo, HeapAlloc, HeapDestroy, HeapFree, HeapReAlloc, HeapSize, HeapValidate, VirtualAlloc
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
HeapCreate
Функция HeapCreate создает объект кучи, который может быть использован вызовом процесса. Функция резервирует непрерывного блока в виртуальном пространстве адреса процесса и распределяет физическое хранение для определенной начальной части этого блока.
РУЧКА HeapCreate(
DWORD flOptions, // ФЛАГ распределения кучи DWORD dwInitialSize, // начальный размер размера максимальной кучи кучи DWORD dwMaximumSize // );
Параметры
flOptions
Определяет дополнительные атрибуты для новой кучи. Эти флаги повлияет на последующий доступ к новой куче через вызовы в функции кучи (HeapAlloc, HeapFree, HeapReAlloc, и HeapSize). Вы можете определить одно или более из следующего флагов:
Значение Флага HEAP_GENERATE_EXCEPTIONS Определяет, что система поднимет исключение, чтобы указывать функциональную неудачу, как например,--условие память, вместо обратного НЕДЕЙСТВИТЕЛЬНОГО. HEAP_NO_SERIALIZE Определяет, что взаимное исключение не будет использовано когда функции кучи распределяют и освобождают память от этой кучи. Встроенный, происходящий когда флаг HEAP_NO_SERIALIZE не определен, должен издать сериями доступ к куче. Преобразование в последовательную форму доступа кучи допускает два или больше резьбы, чтобы одновременно распределять и освобождать память от той же кучи.
dwInitialSize
Определяет начальный размер, в байтах, кучи. Эта величина определяет начальную сумму физического хранения, которое распределено для кучи. Величина округлена в большую сторону на следующую страничную границу. Для того, чтобы определять размер страницы в главном компьютере, используйте функцию GetSystemInfo.
dwMaximumSize
Если dwMaximumSize - ненулевая величина, это определяет максимальный размер, в байтах, кучи. Функция HeapCreate округляет dwMaximumSize вплоть до следующей страничной границы, затем резервирует блока этого размера в пространстве виртуального адреса процесса для кучи. Если просьбы распределения были сделаны HeapAlloc или функции HeapReAlloc превышают начальную сумму физического хранения определенного dwInitialSize, система распределяет дополнительные страницы физического хранения для кучи, вплоть до максимального размера кучи.
Кроме того, если dwMaximumSize ненулевой, куча не может возрасти, и абсолютное ограничение возникает: максимальный размер блока памяти в куче - немного менее чем байты 0x7FFF8. Просьбы, чтобы распределять больших блоков потерпит неудачу, даже если бы максимальный размер кучи - большой достаточно, чтобы содержать блока. Если dwMaximumSize - нуль, это определяет, что куча - growable. Размер кучи ограничивается только доступной памятью. Просьбы, чтобы распределять блоков больших чем байты 0x7FFF8 автоматически не терпеть неудачу; система называет VirtualAlloc, чтобы получать память необходимую для таких больших блоков. Приложения, что нужно распределять большую память, блоки должны устанавливать dwMaximumSize в нуль.
Обратные Величины
Если функция добивается успеха, обратная величина является ручкой вновь созданной кучи. Если функция терпит неудачу, обратная величина - НЕДЕЙСТВИТЕЛЬНО. Для того, чтобы расширять информацию ошибки, назовите GetLastError.
Замечания
Функция HeapCreate создает частный объект кучи из которого вызов процесса может распределить блоков памяти используя функцию HeapAlloc. Начальный размер определяет количество совершенных страниц, которые первоначально распределены для кучи. Максимальный размер определяет общее число резервных страниц. Эти страницы создают непрерывного блока в пространстве виртуального адреса процесса в который куча может возрасти. Если запросы HeapAlloc превышают текущий размер совершенных страниц, дополнительные страницы автоматически совершены из этого зарезервировавшее пространство, допуская что физическая память доступна.
Память частного объекта кучи доступна только в процессе, что создавшее это. Если динамическая связь библиотеки (DLL) создает частную кучу, куча создана в пространстве адреса процесса, которое было названо DLL, и это доступно только в этом процессе. Система использует память из частной кучи, чтобы загружать структуры поддержки кучи, так что не все определившее, что размер кучи пригодный для процесса. Например, если функциональные запросы HeapAlloc 64 килобайтов (K) из кучи с максимальным размером 64K, запрос может потерпеть неудачу из-за системы наверху.
Если флаг HEAP_NO_SERIALIZE не определен ( простой по умолчанию), куча издаст сериями доступ в пределах вызова процесса. Преобразование в последовательную форму гарантирует взаимное исключение когда два или больше попытки резьбы, чтобы одновременно распределять или освобождать блоков от той же кучи. Есть небольшое исполнение стоило в преобразование в последовательную форму, но должно быть использовано всякий раз, когда многочисленная резьба распределяет и освобождает память от той же кучи. Установка флага HEAP_NO_SERIALIZE устраняет взаимное исключение в куче. Без преобразования в последовательную форму, два или больше резьбы, что использовать ту же кучу, ручка могла пытаться распределять или освобождать память одновременно, вероятно вызывающая коррупция в куче. Флаг HEAP_NO_SERIALIZE может, следовательно, благополучно использоваться только в следующих ситуациях:
Процесс имеет только один резьба. Процесс имеет многочисленную резьбу, но только один резьба призывает функции кучи к специфической куче. Процесс имеет многочисленную резьбу, и приложение обеспечивает свой собственный механизм для взаимного исключения в специфическую кучу.
Смотри Также
GetProcessHeap, GetProcessHeaps, GetSystemInfo, HeapAlloc, HeapDestroy, HeapFree, HeapReAlloc, HeapSize, HeapValidate, VirtualAlloc
|
|
|
|
| |