Совместимость типов. Приведение и преобразование типов

Рис. 50. Ошибочное применение висящего указателя

Висящие ссылки

Рис. 48. Возникновение мусора

В результате накопления мусора уменьшается объем доступной свободной памяти и возрастает вероятность отказа на запрос о выделении памяти. Существуют специальные программы, называемые “сборщиками мусора ”. Они могут быть вызваны, когда запасы имеющейся памяти почти исчерпаны или когда невозможно удовлетворить очередной запрос на выделение памяти, или когда размер доступной области памяти стал меньше некоторого заранее заданного числа. На время работы сборщика мусора нормальное выполнение программы приостанавливается. Алгоритм сбора мусора обычно выполняется в два этапа. На первом этапе осуществляется просмотр всех указателей от всех программных объектов ко всем зарезервированным блокам. Каждый блок, к которому есть доступ, маркируется. На втором этапе просматривается вся куча, метки у маркированных блоков стираются, а все блоки, которые не были отмечены, возвращаются в список свободной памяти. Сбор мусора снижает эффективность выполнения программы, особенно если свободная память практически исчерпана, поэтому многие администраторы динамической памяти (в частности, в Turbo Pascal) не используют сборщики мусора. Контроль за предотвращением возникновения мусора возлагается на программиста.

Висящая ссылка (указатель) - это существующий в программе указатель, который открывает доступ к уже несуществующему объекту (т.е. к уже освобожденному участку памяти). Возникновение висящей ссылки иллюстрирует программный фрагмент и рис. 49.

...

var p,q: PList;

begin

new (p); q:=p;

...

dispose(p); p:=nil;

{ q – висящая ссылка }

end;

 
 


Рис. 49. Возникновение висящей ссылки

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

Type

PT1 = ^ T1; PT2 = ^ T2;

T1 = record T2 = record

x, y: word a: byte; b: char; c: integer

end; end;

Var p, q: PT1; r: PT2;

...

new (p);

readln (p^.x, p^.y);

q:=p;

...

dispose (p); p:=nil;

...

new (r);

readln(r^.a);

readln(r^.b);

readln(r^.c);

...

writeln(q^.x); {? }

writeln(q^.y); {? }

Через указатель q по-прежнему видна структура, соответствующая объекту типа Т1 с атрибутами х и у, ранее размещенному в том блоке памяти, который позже был зарезервирован для объекта типа Т2 с атрибутами а, в, с. Результат применения в программе висящей ссылки приводит к ошибкам, которые трудно обнаружить, поэтому висящие ссылки “опаснее” накопления мусора.

Проблему висящих ссылок можно было бы решить, если бы администратор реализовывал метод счетчиков ссылок. В этом методе для каждого зарезервированного блока имеется счетчик, показывающий, сколько объектов программы имеют непосредственный доступ к этому блоку, т.е. указатель на него. Когда некоторый блок резервируется впервые, его счетчик ссылок устанавливается в 1. Каждый раз, когда создается связь между некоторым идентификатором и этим блоком, значение счетчика ссылок увеличивается на 1; каждый раз, когда такая связь уничтожается, значение счетчика ссылок уменьшается на 1. Когда значение счетчика ссылок становится равным нулю, соответствующий блок оказывается недоступным, а, следовательно, неиспользуемым. В этот момент он возвращается в список свободной памяти. Однако ведение счетчиков ссылок может значительно увеличить время исполнения программы, поэтому в администраторах этот метод практически не используется, а контроль за отсутствием висящих ссылок возлагается на программиста.

5. множественная интерпретация объектов

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

¨ оба ини есть один и тот же тип;

¨ оба вещественные;

¨ оба целые;

¨ один тип есть тип-диапазон второго типа;

¨ оба являются типами-диапазонами одного и того же базового типа;

¨ оба являются множествами, составленными из элементов одного и того же базового типа;

¨ один тип – есть тип-строка, а другой – тип-строка или символ;

¨ один тип есть любой указатель, а другой – нетипизированный указатель;

¨ оба есть процедурные типы с обинаковым типом результата (для функций), количеством параметров и типом взаимно соответствующих параметров.

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

Приведение типа возможно только для объектов, совместимых по представлению. Приведение типа состоит в следующем: определяя тип объекта, мы определяем представление (структуру) элемента хранения объекта данного типа. Но если “взглянуть” на образ объекта в памяти с точки зрения машинного представления другого типа, то можно трактовать тот же самый элемент хранения как принадлежащий другому типу. Для этого используются функции приведения типов:

Функция приведения:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: