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

4.5.3. Освобождение фрагментов динамической памяти.

Для освобождения целого фрагмента динамической памяти (занятого несколькими данными) перед началом выделения памяти, т. е. до применения процедур New или GetMem, в переменной-указателе запоминается текущее значение указателя HeapPtr с помощью процедуры

Mark(<идентификатор_указателя>)

Для освобождения фрагмента кучи, начиная от того адреса, который запомнила процедура Mark, и до конца динамической памяти определена процедура

Release(<идентификатор_указателя>),

Var

P: Pointer;

P1, P2: ^integer;

begin

Mark(P);

GetMem(P1, …);

New(P2);

Release(P);

end.

Вызов Release уничтожает список свободных фрагментов в куче, которые могли быть созданы до этого процедурами Dispose или FreeMem, поэтому не следует использовать одновременно механизм освобождения памяти с помощью процедур FreeMem, Dispose и Release.

5. Динамический массив

Динамическим называется массив, память для которого выделяется во время выполнения программы, обращение к области памяти осуществляется через указатель на ее начало.

5.1. Необходимость использования средств работы с динамической памятью при обработке массивов.

Необходимость использования средств работы с динамической памятью при обработке массивов возникает в случаях, когда статическая реализация неэффективна (например, размеры массивов заранее неизвестны, а резервирование памяти максимально возможного объема нерационально). Динамическая память – это фактически единственная возможность обработки массивов данных большой размерности, таких, которые настолько велики, что не могут быть размещены в сегменте данных размером в 64 Кбайт. Только в динамической памяти можно создать массив, размер которого заранее не определён.

Один из возможных вариантов получения динамического двумерного массива размерности n на m:

type

mas = array [1..1] of integer;

pmas = ^mas;

matr = array [1..1] of pmas;

pmatr = ^matr;

var

a: pmatr;

n, m: integer;

begin

readln(n, m);

GetMem (a, n*sizeof(pmas));

for i:=1 to n do

GetMem (a^[i], m*sizeof(integer));

. . . . .

{обращение к отдельному элементу имеет вид a^[i]^[j] }

. . . . .

for i:=1 to n do

FreeMem (a^[i], m*sizeof(integer));

FreeMem (a, n*sizeof(pmas));

end.

5.2. Описание интерфейсов для статического и динамического массивов.

Понятие массив используется на уровне постановки задачи: за­дается или должно быть сформировано множество однотипных данных. При описании интерфейса подпрограммы – связи с программой или другими подпрограммами – необходимо знать перечень входных и выходных данных, их тип и способ размещения.

Вопросы использования статического или динамического массивов связаны с эффективностью реализации подпрограммы и не должны влиять на интерфейс, поэтому следует выбрать способ описания интерфейса, позволяющий отложить решение этих вопросов, по крайней мере, до этапа разработки схемы решения.

Входные и выходные данные при работе со статическим или динамическим массивом будут иметь один и тот же вид, но в случае работы с динамическим массивом его имя заменится на указатель с соответствующей спецификой его обработки.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]