Энциклопедия Turbo Pascal. Главы 1-4 - Функции Mark и Release

ОГЛАВЛЕНИЕ

Функции Mark и Release

Альтернативой использованию функции Dispose является применение функций Mark и Release,  которые совместно обеспечивают освобождение динамического участка памяти после его использования в программе.  В действительности вызов функции Mark должен делаться до обращения к функции New,  а вызов функции Release  должен делаться после функции New,  когда требуется перераспределить память. Функция Release освобождает все участки памяти, которые выделялись между вызовами функций Mark и Release.  Таким способом системе возвращается несколько участков памяти, а при использовании функции Dispose возвращается только один участок памяти,  задаваемый соответствующим указателем.

В функции Mark используется один аргумент. Он должен являться указателем переменной любого типа, поскольку единственным назначением этой функции является сохранением начала области памяти в динамической области.  Функция Release должна использовать тот же указатель,  который не должен модифицироваться.  Например,  в приведенной ниже программе выполняется динамическое выделение памяти под массив из сорока целых чисел и освобождение ее при помощи функций Mark и Release:

{Динамическое выделение памяти с использованием Mark и Release.}
    program alloc;

    type
      pntr = ^RecType;
      RecType = array[1..40] of integer;

    var
      p: pntr;
      t: integer;
      q: ^integer;

    begin
      Mark(q);
      New(p);
      for t: = 1 to 40 do p^[t]:=t*2;
      for t:= 1 to 40 do Write(p^[t], ' ');
      WriteLn;
      Release(q);
     {В этом месте вся память уже возвращена системе}
    end.

Метод управления динамическим распределением памяти зависит от того, как вы хотите возвращать память системе. Если память будет возвращаться частично,  то следует использовать функцию Dispose.  Если вы всегда предполагаете освобождать всю память, то лучше использовать функции Mark и Release. В примерах в этой книге используется функция Dispose,  поскольку такой метод обладает большей гибкостью. Однако вы можете свободно пользоваться функциями Mark и Release для освобождения памяти,  если это больше подходит для ваших задач.