Иллюстрированный самоучитель по Турбо Паскалю
Процедуры и функции для работы с динамической памятью
Ниже приводится
описание как уже рассмотренных процедур и
функций, так и некоторых других, которые
могут оказаться полезными при обращении к
динамической памяти. ,
Функция 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).