SetMemoryManager, процедура

Синтаксис


procedure SetMemoryManager(const NewMgr: TMemoryManager);

Описание

Процедура SetMemoryManager устанавливает новый менеджер памяти для обработки запросов на выделение памяти от процедур GetMem, New, операций создания объектов и других данных, включая длинные строки, динамические массивы и значения типа Variant.
SetMemoryManager - настоящая процедура.

Ошибки

Советы и приемы

  • При установке нового менеджера памяти модуль, вызывающий SetMemoryManager, должен быть первым модулем проекта. Если это не так, первый модуль наверняка выделит память через встроенный менеджер памяти Delphi, и новому менеджеру после установки придется освобождать память, которую он не выделял.
  • По той же причине не следует сохранять и восстанавливать исходный менеджер памяти. Delphi выделяет память в непредсказуемые моменты, и нельзя полагаться на порядок инициализации и завершения модулей, чтобы обеспечить освобождение памяти тем же менеджером, которым она выделялась. Единственный безопасный подход - исключительное использование только одного менеджера памяти.
  • Используя DLL, будьте осторожны с памятью, которую она выделяет и которая не освобождается при выгрузке библиотеки. Это легко может случиться, если через границы DLL передаются длинные строки, динамические массивы или значения типа Variant. Решение состоит в перенаправлении всех запросов к памяти в отдельную DLL. В Delphi модуль ShareMem использует для этого borlndmm.dll, и программист может подключить ту же библиотеку со своим менеджером памяти.

Пример


// Отладочный менеджер памяти выделяет защитное слово вокруг
// каждого выделяемого участка памяти, Если защитное слово затирается,
// у вас возникли проблемы. Выделяемые и свободные блоки используют
// разные значения защитных слов для проверки на двойное освобождение.
// Когда блок освобождается, его содержимое переписывается с помощью
// FreeFill, что помогает отслеживать ошибки при обращении к
// освобожденному блоку.
const
  AllocatedGuard = $0AC0ACDC;
  FreeGuard	 = $0FC0FCEE;
  FreeFill	 = $42FE;
  GuardSize      = SizeOf(LongInt);
  MaxArraySize   = MaxInt div 4 - 1;
type
  TIntegerArray = array[0..MaxArraySize] of LongInt;
  PIntegerArray = ^TIntegerArray;

// Округление Size до значения,   кратного размеру защитного
// слова
function RoundUpSize(Size:  Integer): Integer;
begin
  Result := (Size + GuardSize - 1) div GuardSize * GuardSize
end;

procedure SetDebugManager;
var
  Mgr: TMemoryManager;
begin
  Mgr.GetMem := DebugGet;
  Mgr.FreeMem := DebugFree;
  Mgr.ReallocMem := DebugRealloc;
  SetMemoryManager(Mgr);
end;

Смотрите также

Функции FreeMemory, GetMemory, IsMemoryManagerSet, ReallocMernory, SysFreeMem, SysGetMem, SysReallocMem, процедура GetMemoryManager.
    Учебник по языку Pascal          Лабораторные работы по программированию          Справочник




Нет комментариев.



Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: