Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
HeapErrorCode - значения кодов ошибокСодержание книги
Поиск на нашем сайте
function IsMemoryManagerSet():Boolean; Проверяет какой менеджер памяти сейчас работает. Если TRUE, то дефолтный менеджер заменен на свой кем-то. procedure GetMemoryManager(var MemMgr: TMemoryManager); Возвращает указатель на текущий диспетчер памяти. type PMemoryManager = ^TMemoryManager; TMemoryManager = record // должна выделить блок памяти размером Size // (Size никогда не может быть равным нулю) и вернуть на // него указатель. Если она не может этого сделать, // она должна вернуть nil. GetMem: function(Size: Integer): Pointer; // должна освободить память Size по адресу P. // P никогда не должен быть равен NIL FreeMem: function(P: Pointer): Integer; // должна перевыделить память. При необходимости должна // скопировать блок памяти на новое место и вернуть на нее // указатель. Если действие невозможно возвращает NIL ReallocMem: function(P: Pointer; Size: Integer): Pointer; end;procedure SetMemoryManager(const MemMgr: TmemoryManager); С помощью этой функции можно установить свой диспетчер памяти. Структкра TmemoryManager описана выше. Диспетчер будет использоваться функциями GetMem, FreeMem, ReallocMem, New, Dispose; а также при вызове конструкторов и деструкторов объектов и работе с длинными строками и динамическими массивами. Пример из справочной системы: var GetMemCount: Integer; FreeMemCount: Integer; ReallocMemCount: Integer; OldMemMgr: TMemoryManager; function NewGetMem(Size: Integer): Pointer;begin Inc(GetMemCount); Result:= OldMemMgr.GetMem(Size);end; function NewFreeMem(P: Pointer): Integer;begin Inc(FreeMemCount); Result:= OldMemMgr.FreeMem(P);end; function NewReallocMem(P: Pointer; Size: Integer): Pointer;begin Inc(ReallocMemCount); Result:= OldMemMgr.ReallocMem(P, Size);end; const NewMemMgr: TMemoryManager = (GetMem: NewGetMem; FreeMem: NewFreeMem; ReallocMem: NewReallocMem); procedure SetNewMemMgr;begin GetMemoryManager(OldMemMgr); SetMemoryManager(NewMemMgr);end;Также, следуя советам справочной системы, если определен свой менеджер памяти, есть смысл использовать следующие 3 функции для работы с динамической памятью (сам этим никогда не пользуюсь, поэтому не знаю на сколько это правдиво): function SysGetMem(Size: Integer): Pointer; Для выделения памяти. Соответствует GetMem. function SysReallocMem(P: Pointer; Size: Integer): Pointer; Перевыделение памяти. Соответствует ReallocMem. function SysFreeMem(P: Pointer): Integer; Освобождение памяти. Соответствует MemFree. Если есть желание, то дополнительную информацию по этой теме можно найти в справочной системе Delphi или можно посмотреть в модуль System.pas. Заключение Все вышесказанное относится к внутренним механизмам работы с динамической памятью для Delphi (еще C++ Builder, по-моему этим пользуется). Менеджер кучи в Delphi, как уже было сказано выше, заточен для работы с ООП, поэтому при переопределении менеджера надо быть готовым к тому, что сильно упадет производительность ваших программ. Можно воспользоваться менеджером кучи, предоставляемым самой ОС. За эти функции отвечает семейство функций HeapCreate() и т.д. Также можно работать с динамической памятью совсем в обход механизма кучи. Для этого используется еще одно семейство API функций ОС – VirtualAlloc(). Это может быть оправданно при работе или с большими объемами данных, требующих непрерывности (как правило, в куче, данные сильно фрагментируются) или для каких-то других сильно специфических задач. В любом случае злоупотреблять этим методом не следует, в итоге вы придете к тому, что реализуете свой механизм кучи
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
Последнее изменение этой страницы: 2017-02-21; просмотров: 392; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.214 (0.006 с.) |