АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Seg(x):word

Ofs(x):word

x - ідентифікатор змінної, процедури чи функції. Ці функції повертають:

seg - адресу сегменту об'єкту x

ofs - адресу зміщення об'єкту x

5) dseg:word; - функція повертає адресу сегменту даних (вміст регістру ds)

cseg:word; - адресу сегменту коду (регістр cs)

sseg:word; - адресу сегменту стеку (регістр ss).

 

Порівняння показівників(=, <>)

Два показівники є рівними тільки у тому випадку, коли вони посилаються на той самий об'єкт - динамічну змінну. Використовувати обережно, оскільки не всі процедури нормалізують значення <сегмент>:<зміщення>.

Визволення динамічної змінної

Надання показівнику значення NIL розриває зв'язок між змінною та показівником, але не знищує самої змінної у динамічній пам'яті. Місце, яке вона займає, залишається зарезервованим і не може бути використано іншими динамічними змінними.

DISPOSE(var p:pointer);

- процедура знищує динамічну змінну, на яку посилається показівник p, та повертає пам'ять, що вона займала, до динамічної нерозподіленої пам'яті. Значення показівника р стає невизначеним. Слідкувати за звільненням динамічних змінних слід самостійно.

Утворювати та визволяти динамічні змінні можна також за допомогою іншої пари процедур:

getmem ~ freemem

Але якщо у процедурах NEW - DISPOSE об'єм пам'яті, що виділяється під динамічну змінну, визначається базовим типом показівника, то у процедурах getmem та freemem він визначається безпосередньо, за допомогою додаткового параметра.

getmem(var p:pointer;size:word);

- утворює динамічну змінну розміром size

freemem(var p:pointer,size:word);

- звільнює динамічну змінну розміром size.

Параметр size повинен дорівнювати відповідному параметру у процедурі getmem.

 

Блочне визволення пам'яті

Існують дві зв'язані між собою процедури, одна з яких фіксує поточний стан динамічної пам'яті (наприклад, перед викликом блоку процедури або функції), а інша відновлює цей стан (наприклад, після його виконання, звільнюючи всі динамічні змінні, які за цей час були утворені).

mark(var p:pointer);

- записує поточний стан heap-області у змінну p (фактично записується heaptr)

release(var p:pointer);

- повертає динамічну область до попереднього стану через показівник p (тобто heapptr надається значення p)

Процедура release(heaporg); звільняє всю динамічно розподілену пам'ять.

 

Таким чином, існує декілька засобів утворення та знищення динамічної змінної:

NEW/DISPOSE

NEW/MARK/RELEASE


1 | 2 | 3 | 4 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.)