![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Висящая ссылка (указатель) - это существующий в программе указатель, который открывает доступ к уже несуществующему объекту (т.е. к уже освобожденному участку памяти). Возникновение висящей ссылки иллюстрирует программный фрагмент и рис. 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); {? }
Рис. 50. Ошибочное применение висящего указателя
Через указатель q по-прежнему видна структура, соответствующая объекту типа Т1 с атрибутами х и у, ранее размещенному в том блоке памяти, который позже был зарезервирован для объекта типа Т2 с атрибутами а, в, с. Результат применения в программе висящей ссылки приводит к ошибкам, которые трудно обнаружить, поэтому висящие ссылки “опаснее” накопления мусора.
Проблему висящих ссылок можно было бы решить, если бы администратор реализовывал метод счетчиков ссылок. В этом методе для каждого зарезервированного блока имеется счетчик, показывающий, сколько объектов программы имеют непосредственный доступ к этому блоку, т.е. указатель на него. Когда некоторый блок резервируется впервые, его счетчик ссылок устанавливается в 1. Каждый раз, когда создается связь между некоторым идентификатором и этим блоком, значение счетчика ссылок увеличивается на 1; каждый раз, когда такая связь уничтожается, значение счетчика ссылок уменьшается на 1. Когда значение счетчика ссылок становится равным нулю, соответствующий блок оказывается недоступным, а, следовательно, неиспользуемым. В этот момент он возвращается в список свободной памяти. Однако ведение счетчиков ссылок может значительно увеличить время исполнения программы, поэтому в администраторах этот метод практически не используется, а контроль за отсутствием висящих ссылок возлагается на программиста.
5. множественная интерпретация объектов
Дата публикования: 2014-11-26; Прочитано: 252 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!