Виділення і вивільнення динамічної пам’яті 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Виділення і вивільнення динамічної пам’яті



Організація динамічної пам’яті

Вся динамічно розподілена пам’ять може розглядатися як суцільний масив, що складається з файлів і називається Heap-областю (купа). Heap-область розміщується в пам’яті комп’ютера вслід за областю пам’яті, яку займає тіло програми.

Нижня границя Heap-області визначається стандартною змінною-вказівником HeapOrg, яка містить абсолютну адресу початку динамічної пам’яті. Верхня границя Heap-област визначається вказівником HeapEnd. Поточне значення вказівника що розділяє зайняту й незайняту частину Heap-області, містить вказівник HeapPtr. При кожному новому виділенні пам’яті система управління Heap-областю пересуває вказівник HeapPtr вгору, в бік збільшення адрес пам’яті. При звільненні розподілених в динамічній пам’яті змінних відбувається зворотній процес., тобто вказівник зсувається вниз.

Об’ємом динамічної розподіленої пам’яті можна керувати за допомогою директиви компілятора {$M}. Її синтаксис: {$M розмір_стеку,розмір_динамічної_памяті}. Розмір стеку є числом в межах від 1024 до 65520, розмір динамічної пам’яті – від 0 до 655360. Ця директива при використанні в модулі користувача не впливає на компіляцію програми.

 

Процедура New

Процедура New(P), де P – змінна типу «вказівник», створює нову динамічну змінну того типу, на який посилається вказівник, і встановлює значення змінної Р таким чином, щоб воно вказувало на цю нову динамічну змінну:

VAR

P1: ^Integer;

P2: ^String;

 

Begin

New(P1);

New(P2);

….

End;

В цьому прикладі після виконання команди New(P1) вказівник Р1 дістає значення рівне тому, яке досі мав вказівник HeapPtr, а значення вказівника HeapPtr буде збільшене на 2,  оскільки довжина внутрішнього представлення типу INTEGER, з яким зв’язаний вказівник Р1, дорівнює 2 байти. Оператор New(P2)  викликає виділення блоку пам’яті довжиною 256 байтів і зміщення вказівника HeapPtr на цю ж величину вгору.

Якщо вказівник посилається на тип даних, для якого потрібно пам’яті більше, аніж доступно для розподілу в Heap-області, то в цьому випадку відбувається помилка виконання програми.

Процедура New може бути використана в якості функції, що повертає вказівник конкретного типу даних. Наприклад, якщо змінна P1 має тип даних, визначений як ^Integer, а змінна P1Int – тип даних Р1, то наступні два оператори

New(P1Int);

P1Int:=New(P1);

еквівалентні.

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

VAR

P1,P2:^Integer;

….

Begin

New(P1);

New(P2);

P1^:=7;

P1^:=7*4;

End.

 

Процедура Dispose

Динамічну пам’ять можна не тільки розподіляти, але й вивільняти. Процедура Dispose(P), де P – змінна типу «вказівник», знищує динамічну змінну, на яку вказує вказівник Р. Кожен повторний виклик оператора New повинен попереджатися викликом оператора Dispose. Ця процедура не міняє значення вказівника Р, а тільки повертає в купу пам’ять, раніше зв’язану з цим вказівником. При цьому повторне використання процедури до вільного вказівника призведе до помилки часу виконання. Для уникнення такої помилки звільнений вказівник можна помітити зарезервованим словом NIL.

 

Dispose(P);

Dispose(Nil);

 

Підсумок

Крім звичайних змінних, пам’ять для яких виділяється ще в процесі компіляції, існують також динамічні, які створюються і знищуються під час роботи програми. Щоб користуватися такими зміннми, слід використовувати вказівники. Вказівники бувають типізованими і нетипізованими. З ними можлива операція розіменування. Для створення нової змінної динамічного типу використовується процедура New(), для знищення – Dispose().


 

Питання по темі

1. Який Pascal-оператор дає змогу визначити адресу змінної?

а) ADDR

б)@

в)­

 

2. Який стандартний тип описує нетипізований вказівник

3. Яка директива компілятора керує об’ємом динамічної розподіленої пам’яті?

а) {$F}

б) {$K}

в) {$M}

 

4. Яка процедура створює нову динамічну змінну?

5. Яка процедура знищує динамічну змінну?



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 48; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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