
- •Работа с динамической памятью
- •Структура программы в оперативной памяти
- •Основные понятия
- •Виды указателей
- •Операции с указателями
- •Переменная указатель может быть в трёх состояниях
- •Операция разадресации или разименования
- •Динамические переменные
- •Освобождение памяти
- •Простейшие действия с указателями
- •Простейшие действия с указателями ( продолжение)
- •Пример работы с динамическими переменными
- •Несвязные динамические данные
- •Простой тип данных
- •МАССИВ
- •Освобождение динамической памяти
- •Освобождение памяти из-под группы переменных
- •Освобождение динамической памяти
- •Освобождение памяти из-под группы переменных
- •Мусор
- •Операция @ и функция addr
- •Стандартные функции
- •Вспомогательные функции
- •ПРОВЕРКА ВОЗМОЖНОСТИ РАЗМЕЩЕНИЯ ЗАПИСИ В
- •Массив указателей на данные одного типа

Освобождение памяти из-под группы переменных
СПИСОК СВОБОДНЫХ БЛОКОВ
•Адреса и размеры свободных блоков, создаваемых Dispose и FreeMem хранятся в списке свободных блоков, который растет сверху вниз от верхней границы сегмента кучи.
•Процедура Release всегда очищает список свободных блоков, что заставляет монитор кучи "забыть" о всех
свободных блоках, которые могли быть ниже указателя кучи. Если Вы смешиваете вызовы Mark и Release с вызовами Dispose и FreeMem, то Вы должны быть уверены, что таких свободных блоков не существует.
21

Мусор
При присваивании указателю другого значения старое значение теряется.
Это приводит к появлению так называемого мусора (обозначен овалом), когда доступа к участку динамической памяти нет, а сам он помечен как занятый.
2 |
4 |
p2^ |
|
|
|
|
|
p1^ |
p1 p2
new(p1);… new(p2); … p1 := p2;
22

Операция @ и функция addr
позволяют получить адрес переменной:
var w : word; 2 w pw : ^word;
...
pw := @w;
{ или pw := addr(w); } pw^ := 2;
pw
@ - унарный оператор, который возвращает адрес статической переменной
23

Стандартные функции
для работы с указателями:
•seg(x) : word — возвращает адрес сегмента для х;
•ofs(x) : word — возвращает смещение для х;
•cseg : word — возвращает значение регистра сегмента кода CS;
•dseg : word — возвращает значение регистра сегмента данных DS;
•ptr(seg, ofs : word) : pointer — по заданному сегменту и смещению формирует адрес типа pointer.
24

Вспомогательные функции
•Функция Maxavail : longint возвращает длину в байтах самого длинного свободного участка динамической памяти.
•Функция Memavail : longint возвращает полный объем свободной динамической памяти в байтах.
•Вспомогательная функция Sizeof(x) : word возвращает объем в байтах, занимаемый x, причем x может быть либо именем переменной любого типа, либо именем типа
25

ПРОВЕРКА ВОЗМОЖНОСТИ РАЗМЕЩЕНИЯ ЗАПИСИ В
КУЧЕ
•Type Rec=
•Record
• Name : String[30];
• Address :
String[20];
• Sex : char;
• age : byte;
•End;
•Var p: ^Rec;
Begin
if MaxAvail < SizeOf(Rec)
then
Writeln('НЕ хватает памяти для записи Rec!!!!!!')
else begin
GetMem(p, SizeOf(Rec)); Writeln('Память под
запись Rec удалось непрерывно разместить в
куче.....');
{Использование и Освобождение динамической памяти, начиная с адреса P }
FreeMem(p, SizeOf(Rec));
end;
Readln
End. 26

Массив указателей на данные одного типа
27