Програмиране за Windows NT
Функции, предназначени за работа с виртуална памет, която ние разгледахме по-горе, които обикновено се използват за използване в блоковете памет на относително голям размер (повече от една страница). Въпреки това, приложението изисква само няколко десетки байта често, например, за създаване на динамични структури или за изтегляне на ресурси на приложенията в паметта. Ясно е, че работи с отделни страници, вие едва ли можете лесно и ефективно да работят с блокове от паметта на малък обем.
Ето защо, други функции са предвидени в програмирането интерфейса на Microsoft Windows NT, за изучаването на които ние сега да се върна. Всички тези функции причини, които току-що са обсъдени функции, които работят на виртуална памет.
Групи от по-памет в Microsoft Windows NT
Както казахме, Microsoft Windows версия 3.1 молба може да поръчате на паметта на двете зони или два басейна - един световен басейн, който е достъпен за всички приложения, както и локално генерирана за всяко приложение.
В този случай 2 MB памет е запазено за стандартен басейн, и веднага след зареждането на приложението 10 килобайта памет, ще бъдат получени в употреба.
Второ, параметрите на стандартен басейн могат да бъдат посочени във файла с определение модул (който е по избор). Така например, по следния начин:
Възможности за басейните на паметта
По този начин, на разположение заявлението Microsoft Windows NT има стандартен басейн и произволен брой динамични басейни памет.
Като първа parmetra всички функции, предназначени да получи от стандартната памет или динамичен басейн, идентификатор на басейн да се предава.
Приготвяне на стандартен идентификатор басейн
Identifier стандарт басейн получи много проста. Този идентификатор се връща от GetProcessHeap XE "GetProcessHeap". не е включена лампа:
Създаване на динамичен басейн
Ако имате нужда от динамичен басейн, можете да го създадете използвайки HeapCreate XE разполага "HeapCreate":
dwMaximumSize dwInitialSize параметри и определя съответно в размер на резервирания басейна на паметта и размера на получената за ползване.
Чрез параметър flOptions можете да предадете на нулева стойност, както и стойността на HEAP_NO_SERIALIZE XE "HEAP_NO_SERIALIZE" и HEAP_GENERATE_EXCEPTIONS XE "HEAP_GENERATE_EXCEPTIONS".
Параметър HEAP_NO_SERIALIZE XE "HEAP_NO_SERIALIZE" трябва да направи многозадачност, които ще бъдат обсъдени в отделна глава на тази книга. Ако не е посочен този параметър, който върви успоредно на задачите на процеса не може едновременно да имат достъп до такъв басейн. Можете да използвате HEAP_NO_SERIALIZE на знамето да се подобри ефективността при създаването на басейна ще използва само един процес задача.
Когато може да възникне за разпределение на паметта от басейна на ситуации за грешки. Ако сигналът не е уточнено HEAP_GENERATE_EXCEPTIONS XE "HEAP_GENERATE_EXCEPTIONS". sootvtetvuyuschy върху функцията грешка ще се върне NULL. В противен случай, приложението ще хвърли изключение. HEAP_GENERATE_EXCEPTIONS флаг е полезна в случаите, когато молбата Ви осигурява обработка на изключения, което позволява да се коригират евентуални грешки.
В случай на успех на функцията HeapCreate XE "HeapCreate" връща идентификатора на динамичен създаден басейна памет. На грешка, се връща NULL (или има изключение, ако посоченият HEAP_GENERATE_EXCEPTIONS флаг).
Премахване на динамичния басейна
За изтриване на динамична памет басейн създадена функция HeapCreate XE "HeapCreate". трябва да използвате HeapDestroy XE "HeapDestroy":
Чрез тази функция, само идентификатор параметър предава отработените динамичен басейн. Имайте предвид, че не трябва да изтривате басейна по подразбиране, минавайки стойност на функция, получен от функцията GetProcessHeap XE "GetProcessHeap".
Функция HeapDestroy XE "HeapDestroy" изпълнява безусловно премахване на басейните за съхраняване, дори ако той е получен от блоковете на паметта по време на отстраняване на басейна, те не са били върнати на системата.
Получаване на блока на паметта от басейна
За паметта на стандарт или динамичен басейн заявление трябва да използвате функцията HeapAlloc XE "HeapAlloc". прототип на които сме дали по-долу:
Що се отнася до параметъра hHeap, а след това за него, можете да използвате всеки идентификатор strandartnogo памет басейн, получена от функцията GetProcessHeap XE "GetProcessHeap". или идентификатор на динамичен басейн, създаден от приложението, което използва функцията HeapCreate XE "HeapCreate".
параметър DwBytes определя размера на паметта, в байтове на желаното приложение.
DwFlags параметър може да бъде комбинация от следните стойности:
Разпределени памет се запълва с нули
Промяна на размера на секцията за съхранение
С функцията HeapReAlloc XE "HeapReAlloc" молба да промените размера на блока на паметта, разпределени по-рано функция HeapAlloc XE "HeapAlloc". намали или да го увеличи. HeapReAlloc функция прототип е както следва:
Определяне на размера на секцията за съхранение
В случай на грешка, тази функция връща стойност на 0xFFFFFFFF.
Ако устройството с памет се използва само един процес задача, можете да премине през стойността на параметъра dwFlags HEAP_NO_SERIALIZE XE "HEAP_NO_SERIALIZE".
Освобождаване
Memory разпределят с помощта HeapAlloc XE разполага "HeapAlloc". Тя трябва да бъде освободен веднага след като вече не е необходимо. Това трябва да се направи с помощта на функцията HeapFree XE "HeapFree":
Ако устройството с памет се използва само един процес задача, можете да премине през стойността на параметъра dwFlags HEAP_NO_SERIALIZE XE "HEAP_NO_SERIALIZE".
Ако размерът на блок памет, заделена за да функционира HeapAlloc XE "HeapAlloc". Това беше променена функция HeapReAlloc XE "HeapReAlloc". за освобождаването на такъв блок от паметта, който все още трябва да използвате HeapFree XE "HeapFree".
Използване на функции изчистване XE "изчистване" и безплатен XE "безплатно"
В библиотеката на Microsoft Visual C ++ предлага стандартни функции, предназначени за автоматично получаване и освобождава памет, като изчистване XE "изчистване" и безплатен XE "безплатно".
Ние имаме добра новина за вас - в среда на Microsoft Windows NT, можете да използвате тези функции със същата ефективност като функции за работа с басейни - HeapAlloc XE "HeapAlloc". HeapFree XE "HeapFree" и така нататък. Въпреки това, тези функции са само на паметта на стандартен басейн.
Едно от предимствата на функции изчистване XE на "изчистване" и безплатен XE "безплатно" е възможността за използването им на други платформи, различни от Microsoft Windows NT.
стари Функцията за управление на паметта
В 32-битови приложения, Microsoft Windows NT, можете да се насладите на много от функциите на управление на операционна система памет на Microsoft Windows версия 3.1, които са оставени в новата операционна система за съвместимост. Ние проучихме подробно функциите на дирекция "Управление на паметта", том 13 "системен програмист библиотека".
Спомнете си, че през 16-битов интерфейс за програмиране на Microsoft Windows версия 3.1, има две групи от функции (глобални и местни), предназначени за работа с глобално и локално басейн памет. Тя действа като GlobalAlloc XE "GlobalAlloc". LocalAlloc XE "LocalAlloc". GlobalFree XE "GlobalFree". LocalFree XE "LocalFree" и така нататък. В 32-битови приложения на Microsoft Windows NT, можете да използвате и двете глобални и локални функции, а резултатът ще бъде точно същото. Причината за това се крие във факта, че всички тези функции са функции на софтуера на Microsoft Windows NT интерфейс, проектиран да работи със стандартни басейн памет: HeapAlloc XE "HeapAlloc". HeapReAlloc XE "HeapReAlloc". HeapFree XE "HeapFree" и така нататък.
Ето списък на старите функции програмен интерфейс, Microsoft Windows NT приложения са на разположение:
Определяне глобален идентификатор (местно) блок памет
Обръщаме внимание на факта, че в среда на Microsoft Windows версия 3.1, може да получите фиксирани (фиксирана), плаващ (подвижен) и се оставя (сменяема) памет.
Що се отнася до сменяема памет, може да се използва за съхранение на данни, които могат лесно да бъдат възстановени, например, като ги чете от средствата за кандидатстване.