Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 семестр ЯП 1 часть.docx
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
52.9 Кб
Скачать

12. Проблема потерянных ссылок. Совместимость ссылочных типов

Работа с динамическими переменными через указатели следует освобождать выделенные области сразу после того, как необходимость в них отпадает, иначе "засорение" памяти ненужным динамическими переменными может привести к быстрому ее исчерпанию.

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

Program _Ex;

Type

PPerson = ^Person;

Person = record

End;

Procedure GetPerson;

Var

P: PPerson;

Begin

P:= New (Person) {отвести память для переменной типа Person}

End;

Begin

WriteLn (MemAvail);

GetPerson;

WriteLn (MemAvail);

End.

Вызов New в процедуре GetPerson приводит к отведению памяти для динамической переменной типа Person. Указатель на эту переменную присваивается переменной Р. после выхода из процедуры GetPerson. все локальные переменные перестают существовать после ее завершения. область памяти, отведенная в процессе работы процедуры GetPerson, продолжают существовать и доступ к ним невозможен, т.к. освободить ее можно с помощью процедуры Dispose.Если требуется доступ к объекту то переменная должна быть описана как глобальная, а если локальная нужно освобождать dispose.

Еще одна проблема которая может возникнуть область памяти освобождена, а в программе остался указатель на эту область.

Var P : ^ Integer;

Procedure X1;

Var I : Integer;

Begin

I:=12345;

P:= @i {ссылочная переменная Р устанавливается на локальную переменную i}

WriteLn (P^) {выведет 12345}

End;

Procedure X2;

Var J : Integer;

Begin

J:= 6789;

WriteLn (P^) {выведет 6789}

End;

Begin X1; X2; End.

В этом примере глобальная ссылочная переменная Р первоначально (в процедуре Х1) устанавливается на локальную переменную i. После завершения процедуры Х1 переменная i исчезает и указатель Р "повисает". Вызов процедуры Х2 приводит к тому, что на место, занимаемое в стеке переменной i, будет помещена локальная переменная j, и указатель Р теперь ссылается на нее.

Совместимость ссылочных типов.

Type

TP1 = ^ Integer;

TP2 = ^ Real;

Var

Р1 : ТР1 ;

Р2 : ТР2 ;// Невозможна операция присваивания, нельзя передавать значения

Для ссылочных переменных одногё о типа допустимы следующие действия:

Var P1, P2 : TP1;

Begin P1 := P2 ;

13. Организация динамических структур с помощью указателей

Основные свойства:

не могут быть постоянными(размер) и в оперативной памяти размер может изменяться от 0 до значения определяемого спецификой задачи;

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

Недостаток:

в элементах хранить связки слишком громоздко

обрабатывать большие объемы памяти.

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

Линейный список упорядоченная последовательность данных. При этом каждый элемент содержит одинаковое количество полей. Структурные свойства линейного списка ограничиваются линейным относительным положением элементов.

Упорядоченность элементов списка может задаваться неявно путем последовательного расположения в элементах дающих возможность для каждого элемента.

Для динамического представления списков каждый элемент списка должен содержать кроме смысловой информации поле типа "указатель". Следовательно, в динамических списковых структурах всегда элементом является запись, одна из компонент которой имеет тип "указатель". В соответствии с этим описание элемента списка будет следующим:

type Tр = ^Sр;

Sp = record