Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
12.05.2015
Размер:
423.94 Кб
Скачать

Освобождение памяти из-под группы переменных

СПИСОК СВОБОДНЫХ БЛОКОВ

Адреса и размеры свободных блоков, создаваемых 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

Соседние файлы в папке Алгоритмы и структуры данных