7.2. Работа с динамической памятью
Использование указателей совместно с процедурами New и Dispose позволяет осуществлять динамическое распределение памяти.
Процедура New(P), где Р - указатель, позволяет выделить область памяти такого размера, в котором можно разместить величину базового типа. Указатель принимает значение адреса выделенной области.
Процедура Dispose (Р), где Р - указатель, позволяет освободить область памяти, на которую указывает указатель Р, для последующего использования. После выполнения процедуры значение указателя Р становится неопределнным.
Пример. Ввести в память машины 500 вещественных чисел, а затем вывести их в обратном порядке.
program EXAMPLE14; |
|
type |
|
Mas = array[l..500] of Real; |
|
Point = ^Mas; |
|
var |
|
P: Point; |
{указатель} |
i: Word; |
|
begin |
|
New(P); |
{выделение области для 500 чисел} |
WriteLn('Введите 500 чисел '); |
|
for i := 1 to 500 do |
|
Read(P^[i]); |
|
for i := 500 downto 1 do |
|
WriteLn(P^[il); |
|
Dispose(P) |
{освобождение области} |
end. |
|
Существует и другая возможность работать с динамической памятью - использовать процедуры GetMem и FreeMem.
Процедура GetMem(P,Size), где Р - переменная типа-указатель (в том числе и типа Pointer), a Size - выделяемая область памяти в байтах, позволяет выделить в динамической памяти область необходимого размера, при этом адрес выделенной области присваивается переменной Р.
Процедура FreeMem(P,Size) - здесь параметры те же, что и в процедуре] GetMem, - освобождает занятую область памяти с адресом, задаваемым переменной Р и размером Size байтов. Эта область становится свободной для повторного использования, а указатель Р становится неопределенным.
Наконец, для управления динамической памятью существует еще две процедуры: Mark и Release.
Процедура Маrk(Р), где Р - переменная типа Pointer, фиксирует текущее состояние динамической памяти, записывая в переменную Р значение указателя свободной области динамической памяти.
Процедура Release (Р), где Р - переменная типа Pointer, позволяет вернуться к состоянию динамической памяти, определяемому переменной Р, которой было присвоено значение процедурой Mark. При этом динамическая память, занятая после выполнения процедуры Mark с адресами больше адреса, зафиксированного в указателе Р, освобождается.
Во избежание ситуаций, приводящих к неправильной работе с динамической памятью, нежелательно использовать процедуру Release попеременно с процедурами Dispose и FreeMem.
|