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

Работа с динамической памятью
Указатели: виды, описание, использование. Динамические переменные.
1

Структура программы в оперативной памяти
В IBM PC-совместимых компьютерах память условно разделена на сегменты (64К).
Адрес каждого байта составляется из номера сегмента и смещения.
Компилятор формирует
сегмент кода, в котором хранится программа в виде
машинных команд, и сегмент данных, в котором выделена +
память под глобальные переменные программы.
Динамическая память
Сегмент стека
Сегмент данных
Сегмент кода
16 бит |
4 бита |
Адрес сегмента |
0000 |
16 бит |
|
Смещение |
|
Физический адрес |
|
20 бит |
|
2

3

Основные понятия
•Переменные для хранения адресов областей памяти называются
указателями (или переменными ссылочного типа).
•В указателе можно хранить адрес данных или программного кода.
•Адрес занимает четыре байта и хранится в виде двух слов, одно из которых определяет сегмент, второе — смещение.
16 бит |
4 бита |
Адрес сегмента |
0000 |
+ |
16 бит |
|
Смещение |
Физический адрес
20 бит
Динамическая память
Сегмент стека
Сегмент данных
Сегмент кода
4

Виды указателей
стандартные: |
|
определяемые программистом: |
var p : pointer; |
|
type pword = ^word; |
|
|
var pw : pword; |
|
|
или: |
|
|
|
|
|
var pw : ^word; |
5

Операции с указателями
• присваивание;
p1 := p2;
• проверка на равенство и неравенство: if p1 = p2 then …
Правила присваивания указателей
•Любому указателю можно присвоить стандартную константу nil, которая означает, что указатель не ссылается на какую-либо
конкретную ячейку памяти: p1 := nil;
•Указатели стандартного типа pointer совместимы с указателями любого типа.
•Указателю на конкретный тип данных можно присвоить только значение указателя того же или стандартного типа.
6

Переменная указатель может быть в трёх состояниях
var p : pointer; (4 байта в статической)
1. Содержать адрес какой – либо переменной память
под которую уже выделена: |
2 |
p^ |
p адрес |
2.Содержать специальный пустой адрес
p Nil
3.Находиться в неопределённом состоянии
p |
? |
? |
|
|
7

Операция разадресации или разименования
применяется для обращения к значению переменной, адрес которой хранится в
2
указателе:
var p1: ^integer; // указатель |
|
|
p1 |
|
|
||
|
|
…
p1^ := 2; inc(p1^); writeln(p1^); // разименование!
С величинами, адрес которых хранится в указателе, можно выполнять любые действия, допустимые для значений этого типа.
8

Динамические переменные
создаются в хипе во время выполнения программы с помощью подпрограмм new или getmem:
•Процедура new( var p : тип_указателя )
•Функция new( тип_указателя ) : pointer
Процедура и функция new обычно применяются для типизированных указателей.
•Процедура getmem( var p : pointer; size : word )
Эту процедуру можно применять и для указателей типа pointer.
9

Освобождение памяти
•Процедура Dispose(var p : pointer)
освобождает участок памяти, выделенный New.
•Процедура Freemem(var p : pointer; size : word)
освобождает участок памяти размером size, начиная с адреса p выделенный Getmem.
•Если память выделялась с помощью New, следует применять Dispose, в противном случае — Freemem.
•Значение указателя после вызова этих процедур становится неопределенным.
10