Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 126

Рис. 11.2

- 197 -

Само значение теперь будет просто пассивно занимать память, т.е. превратится в «мусор».

Ссылочные переменные и указатели совместимы между собой по типу, т.е. нет ошибки в присваивании


DimPtr := RecPtr;

но после разыменования контроль типов становится строгим и

DimPtr^ := RecPtr^;

дает ошибку. Здесь речь идет уже не о значениях вполне совместимых адресов, а о разнотипных значениях по этим адресам.

Ссылки могут сравниваться между собой. Под этим понимается сравнение соответствующих сегментов и смещений адресов, хранимых в них. Имеют смысл лишь проверки на равенство и на неравенство ссылок или указателей:

if DimPtr = XXXPtr then ... ;

if DimPtr <> XXXPtr then ... ;

Сравнения ссылок не всегда работают корректно. Если две ссылки указывают на один и тот же адрес в памяти, но этот адрес записан в них различными значениями (что вполне возможно), то они считаются различными. Процедуры New и GetMem всегда возвращают ссылки, приведенные к такому виду, что смещения адреса имеют значения от 0 до 15 ($F), и они будут сравниваться корректно. А специальные функции типа Addr, Ptr этого не делают, и сравнивать их результаты с чем-либо надо с большой осторожностью.

Разыменованные ссылки на структуры индексируются (массивы) или разделяются на поля (записи, объекты) обычным образом. Для определенных выше ссылок это выглядит следующим образом:

DimPtr^ [i] — доступ к элементу i динамического массива,

RecPtr^.Поле — доступ к полю динамической записи,

ObjPtr^.Метод — доступ к методу динамического объекта.

После объявления в программе ссылки или указателя его значение не определено и содержит случайный адрес. Для работы с динамическими переменными их всегда необходимо сначала разместить специальными процедурами в памяти или хотя бы присвоить ссылке корректное значение адреса.

11.3. Организация памяти области кучи


Для размещения динамических переменных используется область памяти, называемая «кучей». Место для данных в куче

- 198 -

отводится и освобождается только во время работы программы, и именно поэтому мы говорим о динамических данных. Место для прочих переменных отводится в специальном сегменте данных еще на этапе компиляции и не меняется впоследствии — это статические данные. Интересно, что сами ссылочные переменные являются статическими и располагаются в сегменте данных, но данные на которые они впоследствии ссылаются, как правило, организуются в куче.

На рис. 11.3 представлено распределение памяти области кучи при работе программ, написанных на Турбо Паскале. Куча первоначально всегда свободна и заполняется от нижних адресов в области кучи. Эта область характеризуется двумя предопределенными в языке указателями (переменными типа Pointer): HeapOrg и HeapPtr. Переменная HeapOrg указывает на начало кучи. Как видно из рис. 11.3, куча начинается сразу за оверлейным буфером. Если же программа не имеет оверлейных блоков, то куча начинается сразу за областью стека. Значение HeapOrg постоянно и, как правило, не меняется по ходу выполнения программы.