
Книга Лекции Паскаль
.pdfВасилькова И.В. |
Лекции |
Паскаль |
В результате выполнения процедуры new(p1) в хипе выделяется объем памяти, достаточный для размещения переменной типа word, и адрес начала этого участка памяти записывается в переменную p1. Второй оператор выполняет аналогичные действия, но используется функция new. При вызове процедуры new с параметром p3 в динамической памяти будет выделено количество байтов, достаточное для размещения записи типа rec.
Доступ к выделенным областям осуществляется с помощью операции разадресации:
p1^ := 2; p2^ := 4; |
p3^.d := p1^; |
p3^.s := 'Вася'; |
В этих операторах в выделенную память заносятся значения. Динамические переменные можно использовать в операциях,
допустимых для величин соответствующего типа, например:
inc(p1^); |
p2^ := |
p1^ |
+ p3^.d; |
with p3^ do writeln |
(d, |
s); |
Для освобождения динамической памяти используются процедуры
Dispose и Freemem, причем, если память выделялась с помощью new, следует применять Dispose, в противном случае — Freemem.
•Процедура Dispose(var p : pointer) освобождает участок памяти, выделенный для размещения динамической переменной процедурой или функцией New, и значение указателя p становится неопределенным.
•Процедура Freemem (var p : pointer; size : word) освобождает участок памяти размером size, начиная с адреса, находящегося в p. Значение указателя становится неопределенным.
Если требуется освободить память из-под нескольких переменных одновременно, можно применять процедуры Mark и Release.
•Процедура Mark(var p : pointer) записывает в указатель p адрес начала участка свободной динамической памяти на момент ее вызова.
•Процедура Release(var p : pointer) освобождает участок динамической памяти, начиная с адреса, записанного в указатель p процедурой Mark.
При завершении программы используемая ею динамическая память освобождается автоматически.
При работе с динамической памятью часто применяются вспомогательные функции Maxavail, Memavail и Sizeof.
61