Вся динамическая память рассматривается как сплошной массив байтов, который называется кучей. Начало кучи хранится в стандартной переменной HEAPORG, конец – в переменной HEAPEND. Текущую границу незанятой динамической памяти указывает указатель HEAPPTR.
Выделение динамической памяти происходит при помощи процедуры NEW(<указатель>). Указатель приобретает адрес, начиная с которого можно разместить данные. Для этого сразу за указателем ставится значок ^.
VAR A:^Integer; B:^Real;
Begin
New(A);
A^ := 649;
Если бы за переменной А не было значка ^, то переменной А присваивался бы адрес, по которому впоследствии будут размещены данные.
Высвобождение динамической памяти происходит при помощи процедуры DISPOSE(<указатель>); При этом значение самого указателя (адрес) не изменяется.
Попеременное обращение к процедурам NEW и DISPOSE часто приводит к образованию «дыр» в памяти. Для освобождения целого фрагмента кучи используется процедура MARK, которая запоминает текущее значение указателя HEAPPTR. Далее в любом месте программы можно освободить фрагмент кучи начиная с данного адреса и до конца динамической памяти при помощи процедуры RELEASE. Не рекомендуется, однако использовать RELEASE совместно с процедурой DISPOSE.
Для работы с нетипизированными указателями используются процедуры:
GETMEM (A, Size) – резервирование памяти,
FREEMEM (A, Size) – освобождение памяти,
где А – нетипизированный указатель,
Size – размер в байтах.
Модули
Модуль – это автономно компилируемая программная единица, включающая в себя различные компоненты раздела описаний (типы, константы, переменные, процедуры и функции) и, возможно, некоторые исполняемые операторы инициирующей части. Модули позволяют разрабатывать библиотеки прикладных программ. Программный код модулей размещается в отдельном сегменте памяти. Количество одновременно используемых модулей ограничивается лишь доступной памятью, что позволяет создавать очень крупные программы. Модуль состоит из заголовка и трех частей, каждая из которых может быть пустой.
UNIT <имя>;
INTERFACE
<интерфейсная часть>
IMPLEMENTATION
<исполняемая часть>
BEGIN
<инициирующая часть>
END.
Имя заголовка модуля должно совпадать с именем дискового файла, в который помещается исходный текст модуля. Т.е. если заголовок UNIT INFORM, то текст модуля должен находиться в файле INFORM.PAS. Имя модуля связывает его с другими модулями и с основной программой при помощи предложения USES <список модулей>.
Например: USES CRT, GRAPH, INFORM;
Предложение USES в модулях находится либо сразу за словом INTERFACE, либо за словом INMPLEMENTATION, либо и там и там.
В интерфейсной части содержаться объявления всех глобальных объектов модуля, доступные основной программе и другим модулям. При объявлении глобальных подпрограмм в интерфейсной части указываются только их заголовки.
Исполняемая часть содержит описание подпрограммы, объявленной в интерфейсной части. В ней могут быть объявлены локальные для модуля объекты.
Инициирующая часть завершает модуль. Она может отсутствовать вместе с начинающим ее словом BEGIN или быть пустой. Здесь размещаются операторы, которые обычно используются для подготовки работы программы.