Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

HeapErrorCode - значения кодов ошибок

Поиск
Код: Константа: Значение:
  cHeapOk Все путем, пока
  cReleaseErr ОС вернула ошибку при попытке освободить память
  cDecommitErr ОС вернула ошибку при попытке освободить память, выделенную в swapе
  cBadCommittedList Список блоков, выделенных в swap-файле, выглядит подозрительно
  cBadFiller1 Плохой филлер. Происходит кода что-то не так со swapом.
  cBadFiller2 - // -
  cBadFiller3 - // -
  cBadCurAlloc Проблемы с текущей зоной выделения памяти
  cCantInit Инициализация сорвалась
  cBadUsedBlock Используемому блоку памяти поплохело
  cBadPrevBlock … и предыдущему тоже
  cBadNextBlock … и до следующего очередь дошла
  cBadFreeList Проблемы со списком свободных блоков. (никогда такого не видел)
  cBadFreeBlock Свободному блоку памяти плохо.
  cBadBalance Несрастухи в бухгалтерии свободных блоков. (вот почему всем так сразу поплохело:))

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 с.)