2. Дії над посиланнями.

В мові Паскаль немає операцій, які давали б результат посилального типу. Адже таким результатом буде  адреса деякої комірки пам’яті. Тому єдиною доцільною операцією для таких об’єктів є операція присвоювання. Так, в результаті виконання оператора p:=q для покажчиків змінна p буде показувати на той самий об’єкт, що і змінна q. Якщо до виконання цього оператора змінна p вже показувала на якийсь об’єкт, то після виконання оператора цей об’єкт став недоступним, на нього не показує жодний покажчик. Якщо динамічний об’єкт стає непотрібним, його можна видалити, звільнивши тим самим місце в пам’яті, яке він займав. Для видалення об’єкту використовується процедура dispose, яка має наступний формат:

dispose(p)

де p – змінна посилального типу.

Після виконання цієї процедури значення змінної p стає невизначеним, адже з цією змінною тепер не пов’язаний жоден з об’єктів. Тому використання цього оператора може бути джерелом некоректної роботи програми.

Приклади:

Останній приклад дуже добре ілюструє типову помилку, коли намагання звільнити пам’ять від непотрібного динамічного об’єкта призводить до помилки. Для упередження такої ситуації часто використовують допоміжну змінну посилального типу, яка показує на об’єкт, що буде видалятись. Після того, коли всі дії з об’єктом виконані, його можна видалити, використавши в ролі параметра процедури dispose цю допоміжну змінну.

Приклад:

r:= p; { запам’ятовування адреси об’єкта}

…  { виконання дій з об’єктом}

dispose(r);  {видалення об’єкта}

Для покажчиків можна використовувати операції  відношення типу “дорівнює” (“=”)  та “не дорівнює” (“<>”). Як правило, можна перевіряти, чи показують два посилання на один і той же об’єкт, і чи взагалі посилання показує на якийсь об’єкт (тобто, чи не є воно порожнім).

На завершення розглянемо ще декілька типових помилок при роботі з динамічними об’єктами.

Type

Numb=^integer;

Var

p,q:numb;

m,n:integer;

p:=m; {різні типи об’єктів}

^p:=5;  {не там знак ^}

p^:=q;  {різні типи об’єктів}

dispose(p^);  {неприпустимий тип операнду}

p^:=3.14;  {різні типи об’єктів}

p^:=nil; {різні типи об’єктів}

p:=nil;  {немає об’єкта

p^:=5;  для присвоєння значення}

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
25 26 27 28  Наверх ↑