Разпределяне на блок памет от купчината

За да направите това, просто извикайте функцията HeapAlloc

PVOID HeapAlloc (HANDLE hHeap, DWORD fdwFlags, SIZE_T dwBytes);

Параметърът hHeap идентифицира манипулатора за купчината, от която е разпределена паметта. Параметърът dwBytes указва броя на байтовете, разпределени в купчината, а параметърът fdwFlags ви позволява да зададете флагове, които влияят върху начина на разпределяне на паметта. В момента се поддържат само три флага. HEAP_ZERO_MEMORY, HEAP_GENERATE_EX CEPTIONS и HEAP_NO_SERIALIZE.

Целта на знамето HEAP_ZERO_MEMORY е очевидна.Тя води до запълване на съдържанието на блока с нули, преди да се върне от HeapAlloc. Вторият флаг кара тази функция да изхвърли програмно изключение, ако в купчината няма достатъчно памет, за да задоволи заявката. Не забравяйте, че този флаг може да бъде посочен и при създаване на купчина с функцията HeapCreate, той казва на мениджъра на купчината да хвърли съответно изключение, ако не е възможно да се разпредели блок в купчината. Ако сте активирали този флаг при извикване на HeapCreate, тогава не е необходимо да го указвате при извикване на HeapAlloc. От друга страна, можете да създадете купчина без флаг HEAP_GE NERATE_EXCEPTIONS. В този случай, ако го посочите при извикване на HeapAlloc, това ще повлияе само на това повикване.

Ако функцията HeapAlloc не успее и е позволено да изхвърля изключения, тя може да хвърли едно от двете изключения, изброени в следващата таблица.

Опитът за разпределяне на паметта е неуспешен поради недостатъчна памет

STATUS_ACCESS_VIOLATION Опитът за разпределяне на паметта е неуспешен поради повреда на купчината или невалидни функционални параметри

Флагът HEAP_NO_SERIALIZE принуждава HeapAlloc да използва последователен достъп до купчина за това повикване. Този флаг трябва да се използва с най-голямо внимание, тъй като купчината (особено стандартната купчина процеси) може да бъде повредена, ако няколко нишки имат достъп едновременно

Win dows 98 счита повикване до HeapAlloc с искане за разпределяне на блок, по-голям от 256 MB, като грешка. Имайте предвид, че в този случай функцията винаги връща NULL и изключение никога не се изхвърля, дори ако сте задали флага HEAP_GENERATE_EXCEPTIONS, когато създавате купчина или се опитвате да разпределите блок.,

За да разпределите големи блокове памет (от 1 MB), се препоръчва да използвате функцията VirtualAlloc, вместо функции, които работят на купчини.

Преоразмеряване на блок

Често е необходимо да промените размера на блока памет. Някои приложения първоначално разпределят по-голям блок от необходимото, а след това, след като поставят данни в него, го намаляват, но някои, напротив, първо разпределят малък блок памет и след това го увеличават, когато се записват нови данни. Функцията HeapReAlloc се извиква за преоразмеряване на блока памет:

PVOID HeapReAlloc (HANDLE hHeap, DWORD fdwFlags, PVOID pvMem,

Както винаги, параметърът hHeap идентифицира купчината, която съдържа блока за промяна. Параметърът fdwFlags указва флаговете, които да се използват при преоразмеряване

pa на HEAP_GENERATE_EXCEPTIONS, HEAP_NO_SERIALIZE, HEAP_ZEROMEMORY или HEAP_REALLOC_IN_PLACE_ONLY.

Първите два флага имат същото значение, както когато се използват с HeapAlloc. Флагът HEAPZEROMEMORY е полезен само при увеличаване на размера на блок памет. В този случай допълнителните байтове, включени в блока, са предварително нулирани. При намаляване на размера на блока този флаг няма ефект.

Определяне на размера на блока

След като разпределите блок памет, можете да се обадите на HeapSize и да разберете истинския размер

SIZE_T HeapSize (HANDLE hHeap, DWORD fdwFlags, LPCVOlD pvMem);

Освобождаване на блок

Това се прави с помощта на функцията HeapFree.

BOOL HeapFree (HANDLE hHeap, DWORD fdwFlags, PVOID pvMem);

Той освобождава блок памет и връща TRUE при успех. Параметърът fdwFlags приема две стойности 0 или HEAP_NO_SFRIALIZE Тази функция е посочена

Това може да накара диспечера на купчината да върне част от физическата памет в системата, но това не е необходимо.

Унищожаване на купчината

Купчината може да бъде унищожена чрез извикване на HeapDestroy-.

BOOL HeapDestroy (HANDLE hHeap);

пространство, заето от купчината. При успех функцията връща TRUE. Ако в края на процеса не унищожите купчината, това се прави от системата, но - отново подчертавам - само в момента на прекратяване на процеса. Ако купчината е създадена от нишка, тя ще бъде унищожена само когато целият процес приключи.

Системата няма да позволи унищожаването на стандартната купчина на процеса - тя се унищожава само когато процесът излезе. Ако предадете манипулатор на тази купчина във функцията HeapDestroy, системата просто ще игнорира вашето обаждане.

Използване на купчини в C програми++