Если в процессе выполнения программы динамический объект, созданный процедурой NEW, становится ненужным, то можно отказаться от выделенного для него места в памяти с помощью процедуры DISPOSE.
В результате выполнения процедуры DISPOSE(P), динамический объект, на который ссылается указатель P, прекращает своё существование, занимаемое им место в памяти считается свободным, а значение указателя P становится неопределенным.
В Турбо Паскале существуют и другие процедуры для работы с динамической памятью:
- Процедура GETMEN(P: PIONTER, SIZE: WORD) где P – указатель, SIZE – размер выделяемой области памяти в байтах. Данная процедура выделяет память под динамические переменные блоками по 8 байт.
- Процедура FREEMEN (P,SIZE) – освобождает занятую область памяти содержимым, задаваемым указателем P и размером SIZE байтов.
Пример:
Создание динамического массива (массива с заранее не заданным числом элементов)
TYPE D = ARRAY [1..2] OF REAL;
VAR A: ^D;
N,I: WORD;
BEGIN
{$R-} {выключение проверки значения индекса массива}
WRITE (‘Ввод размерности массива’);
READLN (N);
GETMEN (A, N*6); {6- число байтов занимаемое переменной типа REAL}
FOR I:=1 TO N DO
A^[ I ] := 0;
- - - - - - FREEMEN (A, N*6);
{$TR+}
END.
Замечание: Если в примере используется метод распределения памяти с помощью процедур GETMEN и FREEMEN, то вызовы этих процедур должны соответствовать друг другу, а значение SIZE при обращении к одному и тому же указателю должно совпадать.
п. 17.3. Операции на указатели.
Для указателей в Паскале допустимы только операции присваивания и сравнения.
Операции присваивания:
Указателю можно присвоить:
- содержимое другого указателя того же типа;
- константу NIL;
- адрес объекта, определенный с помощью функции ADDR (или оператора @);
Пример: VAR N: INTEGER;
P1,P2: ^ INTEGER;
P3: ^ REAL;
P: PIONTER;
Допустимо присваивание:
P1:=P2; P1:=NIL; P2:=@N; P:=P1; P2:=P;
Недопустимо присваивание:
P1:=P3;
Операции сравнения: ‘=’, ‘<’, ’>’.
Два указателя равны, если они оба есть NIL, либо указывают на один и тот же динамический объект.
Во всех остальных случаях имеет место неравенство.
п. 17.4. Распределение ОП в языке Паскаль и Си.
Память в ПЭВМ адресуется двумя шестнадцатеричными словами (BA: BS), где
BA – сегментный адрес; BS – смещение.
Сегмент – это участок памяти длиной 64 Кбайта, который начинается с физического адреса, значение которого кратно числу 16.
Смещение – это число, которое определяет номер байта в сегменте, к которому необходимо обратиться.
Схемы распределения ОП.
а) В Турбо Паскале
EXE файл |
Префикс сегмента программы |
Младшие – Старшие адреса |
|
Кодовый сегмент главной программы |
|||
Кодовый сегмент последующего модуля |
Обратный порядок списка USES |
||
- - - - - - - |
|||
Кодовый сегмент первого модуля |
|||
Кодовый сегмент SISTEM |
|||
Сегмент данных и главных переменных |
|||
Стек |
|||
Свободный стек |
|||
Оверлейный буфер |
Heap Org |
||
ДРОП |
Динамическая область |
Heap Ptr |
|
Свободная память динамической области |
Free Ptr |
||
Свободная память |
б) В Турбо Си
Код программы |
Младшие – Старшие адреса |
Статические данные (глобальные переменные и константы) |
|
Куча |
|
Свободная память |
|
Стек |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.