ЛЕКЦИЯ № 7. Динамическая память
1. Ссылочный тип данных. Динамическая память. Динамические переменные
Статической переменной (статически размещенной) называется описанная явным образом в программе переменная, обращение к ней осуществляется по имени. Место в памяти для размещения статических переменных определяется при компиляции программы. В отличие от таких статических переменных в программах, написанных на языке Pascal, могут быть созданы динамические переменные. Основное свойство динамических переменных заключается в том, что они создаются, и память для них выделяется во время выполнения программы.
Размещаются динамические переменные в динамической области памяти (heap-области). Динамическая переменная не указывается явно в описаниях переменных, и к ней нельзя обратиться по имени. Доступ к таким переменным осуществляется с помощью указателей и ссылок.
Ссылочный тип (указатель) определяет множество значений, которые указывают на динамические переменные определенного типа, называемого базовым типом. Переменная ссылочного типа содержит адрес динамической переменной в памяти. Если базовый тип является еще не описанным идентификатором, то он должен быть описан в той же самой части описания типов, что и тип-указатель.
Зарезервированное слово nil обозначает константу со значением указателя, которая ни на что не указывает.
Приведем пример описания динамических переменных.
var p1, p2 : ^real;
p3, p4 : ^integer;
…
2. Работа с динамической памятью. Нетипизированные указатели
1. Процедура New(var p: Pointer).
Выделяет место в динамической области памяти для размещения динамической переменной рЛ, и ее адрес присваивает указателю р.
2. Процедура Dispose(varp: Pointer).
Освобождает участок памяти, выделенный для размещения динамической переменной процедурой New, и значение указателя р становится неопределенным.
3. Процедура GetMem(varp: Pointer; size: Word).
Выделяет участок памяти в heap-области, присваивает адрес его начала указателю р, размер участка в байтах задается параметром size.
4. Процедура FreeMem(var p: Pointer; size: Word).
Освобождает участок памяти, адрес начала которого определен указателем р, а размер – параметром size. Значение указателя р становится неопределенным.
5. Процедура Mark(var p: Pointer)
Записывает в указатель р адрес начала участка свободной динамической памяти на момент ее вызова.
6. Процедура Release(var p: Pointer)
Освобождает участок динамической памяти, начиная с адреса, записанного в указатель р процедурой Mark, т. е. очищает ту динамическую память, которая была занята после вызова процедуры Mark.
7. Функция MaxAvaikLongint
Возвращает длину в байтах самого длинного свободного участка динамической памяти.
8. Функция MemAvaikLongint
Возвращает полный объем свободной динамической памяти в байтах.
9. Вспомогательная функция SizeOf(X):Word
Возвращает объем в байтах, занимаемый X, причем X может быть либо именем переменной любого типа, либо именем типа.
Встроенный тип Pointer обозначает нетипизированный указатель, т. е. указатель, который не указывает ни на какой определенный тип. Переменные типа Pointer могут быть разыменованы: указание символа ^ после такой переменной вызывает появление ошибки.
Как и значение, обозначаемое словом nil, значения типа Pointer совместимы со всеми другими типами указателей.