|
Процедуры и функции для работы с динамической памятью
Ниже приводится описание
как уже рассмотренных процедур и функций, так и некоторых
других, которые могут оказаться полезными при обращении
к динамической памяти. ,
Функция ADDR.
Возвращает результат типа POINTER, в
котором содержится адрес аргумента. Обращение:
ADDR ( X )
Здесь Х- любой объект программы (имя
любой переменной, процедуры, функции). Возвращаемый
адрес совместим с указателем любого типа. Отметим, что
аналогичный результат возвращает операция @ .
Функция CSEG.
Возвращает значение, хранящееся в регистре
CS микропроцессора в начале работы программы в регистре
CS содержится сегмент начала кода программы). Обращение:
CSEG
Результат возвращается в слове типа
WORD.
Процедура DISPOSE.
Возвращает в кучу фрагмент динамической
памяти, который ранее был зарезервирован за типизированным
указателем. Обращение:
DISPOSE(TP)
Здесь ТР - типизированный указатель.
При повторном использовании процедуры применительно
к уже освобожденному фрагменту возникает ошибка периода
исполнения. При освобождении динамических объектов можно
указывать вторым параметром обращения к DISPOSE имя
деструктора (подробнее см. гл.10).
Функция DSEG.
Возвращает значение, хранящееся в регистре
DS микропроцессора (в начале работы программы в регистре
DS содержится сегмент начала данных программы). Обращение:
DSEG
Результат возвращается в слове типа
WORD.
Процедура FREEMEM.
Возвращает в кучу фрагмент динамической
памяти, который ранее был зарезервирован за нетипизированным
указателем. Обращение:
FREEMEM ( Р, SIZE )
Здесь Р - нетипизированный указатель;
SIZE - длина в байтах освобождаемого
фрагмента.
При повторном использовании процедуры
применительно к уже освобожденному фрагменту возникает
ошибка периода исполнения.
Процедура GETMEM.
Резервирует за нетипизированным указателем
фрагмент динамической памяти требуемого размера. Обращение:
GETMEM ( Р, SIZE )
За одно обращение к процедуре можно
зарезервировать не более 65521 байтов динамической памяти.
Если нет свободной памяти требуемого размера, возникает
ошибка периода исполнения. Если память не фрагментирована,
последовательные обращения к процедуре будут резервировать
последовательные участки памяти, так что начало следующего
будет располагаться сразу за концом предыдущего.
Процедура MARK.
Запоминает текущее значение указателя
кучи HEAPPTR. Обращение:
MARK ( PTR )
Здесь PTR - указатель любого типа, в
котором будет возвращено текущее значение HEAPPTR. Используется
совместно с процедурой RELEASE для освобождения части
кучи.
Функция MAXAVAIL.
Возвращает размер в байтах наибольшего
непрерывного участка кучи. Обращение:
MAXAVAIL
Результат имеет тип LONGINT. За один
вызов процедуры NEW или GETMEM нельзя зарезервировать
памяти больше, чем значение, возвращаемое этой функцией.
Функция MEMAVAIL.
Возвращает размер в байтах общего свободного
пространства кучи. Обращение:
MEMAVAIL
Результат имеет тип LONGINT.
Процедура NEW.
Резервирует фрагмент кучи для размещения
переменной. Обращение:
NEW ( ТР )
Здесь ТР - типизированный указатель.
За одно обращение к процедуре можно
зарезервировать не более 65521 байта динамической памяти.
Если нет свободной памяти требуемого размера, возникает
ошибка периода исполнения. Если память не фрагментирована,
последовательные обращения к процедуре будут резервировать
последовательные участки памяти, так что начало следующего
будет располагаться сразу за концом предыдущего.
Процедура NEW может вызываться как функция.
В этом случае параметром обращения к ней является тип
переменной, размещаемой в куче, а функция NEW возвращает
значение типа указатель. Например:
type
PInt =^Integer;
var
p: Pint;
begin
p := New(PInt);
......
end.
При размещении в динамической памяти
объекта разрешается в качестве второго параметра обращения
к NEW указывать имя конструктора (см. гл.10).
Функция OFS.
Возвращает значение типа WORD, содержащее
смещение адреса указанного объекта. Вызов:
OFS ( X )
Здесь Х- выражение любого типа или
имя процедуры.
Функция PTR.
Возвращает значение типа POINTER по
заданному сегменту SEG и смещению OFS. Вызов:
PTR ( SEG, OFS )
Здесь SEG - выражение типа WORD, содержащее
сегмент;
OFS - выражение типа WORD, содержащее
смещение.
Значение, возвращаемое функцией, совместимо
с указателем любого типа.
Процедура RELEASE.
Освобождает участок кучи. Обращение:
RELEASE ( PTR )
Здесь PTR - указатель любого типа, в
котором предварительно было сохранено процедурой MARK
значение указателя кучи. Освобождается участок кучи
от адреса, хранящегося в PTR, до конца кучи. Одновременно
уничтожается список всех свободных фрагментов, которые,
возможно, были созданы процедурами DISPOSE или FREEMEM.
Функция SEG.
Возвращает значение типа WORD, содержащее
сегмент адреса указанного объекта. Вызов:
SEG ( X )
Здесь X - выражение любого типа или
имя процедуры.
Функция SIZEOF.
Возвращает длину в байтах внутреннего
представления указанного объекта. Вызов:
SIZEOF ( X )
Здесь X - имя переменной, функции или
типа. Например, везде в программе из примера 6.1 вместо
константы SIZEOFREAL можно было бы использовать обращение
SIZEOF(REAL).
|