Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 315; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.227.140.251 (0.007 с.) |