| 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. 
 
 |