Работа с динамической памятью и указателями в системе Turbo Pascal. Мирецкий И.Ю - 9 стр.

UptoLike

Составители: 

HeapPtr нормализуется после каждой операции, устанавливая смещение в диапазоне от $0000 до
$000F. Максимальный размер переменной, который может быть распределен в куче, равен 65519 байт
($10000 - $000F), поскольку каждая переменная должна полностью находиться в одном сегменте.
9. Освобождение памяти
Динамические переменные, хранящиеся в куче, удаляются одним из двух путей:
1) через Dispose или FreeMem,
2) через Mark и Release.
Рассмотрим
второй способ. На рис. 2 показано начальное состояние кучи после выполнения опера-
торов
New(Ptr1);
New(Ptr2);
Mark(P);
New(Ptr3);
New(Ptr4);
New(Ptr5);
Оператор Mark(P) помечает состояние кучи перед распределением Ptr3 (сохранением текущего
HeapPtr в P). Если выполнить оператор Release(P), то состояние кучи станет таким, как на рисунке 3 (ос-
вобождены все указатели, распределенные после вызова Mark).
Примечание. Выполнение оператора Release(HeapOrg) полностью очищает всю кучу, поскольку
HeapOrg
указывает на нижнюю границу кучи.
Для программ, которые освобождают указатели в порядке, точно обратном порядку их распределе-
ния, процедуры Mark и Release очень эффективны. Однако большинство программ распределяют и ос-
вобождают указатели случайным образом. Это требует более сложной техники управления и реализуется
процедурами Dispose и FreeMem. Эти процедуры позволяют программе освобождать любой указатель в
любое время.
Ptr1 Нижняя граница памяти
содержимое Ptr1^
Ptr2
содержимое Ptr2^
Ptr3
содержимое Ptr3^
Ptr4
содержимое Ptr4^
Ptr5
содержимое Ptr5^
HeapPtr
HeapEnd Верхняя граница памяти
Рис. 2. Начальное состояние кучи
Ptr1 Нижняя граница памяти
содержимое Ptr1^
Ptr2
содержимое Ptr2^
HeapPtr
HeapEnd Верхняя граница памяти
Рис.3. Распределение кучи после выполнения Release(P)
        HeapPtr нормализуется после каждой операции, устанавливая смещение в диапазоне от $0000 до
$000F. Максимальный размер переменной, который может быть распределен в куче, равен 65519 байт
($10000 - $000F), поскольку каждая переменная должна полностью находиться в одном сегменте.

                                        9. Освобождение памяти
          Динамические переменные, хранящиеся в куче, удаляются одним из двух путей:
          1) через Dispose или FreeMem,
          2) через Mark и Release.
          Рассмотрим второй способ. На рис. 2 показано начальное состояние кучи после выполнения опера-
торов

          New(Ptr1);
          New(Ptr2);
          Mark(P);
          New(Ptr3);
          New(Ptr4);
          New(Ptr5);


 Ptr1                                                     Нижняя граница памяти
                           содержимое Ptr1^
Ptr2
                           содержимое Ptr2^
Ptr3
                           содержимое Ptr3^
Ptr4
                           содержимое Ptr4^
Ptr5
                           содержимое Ptr5^
HeapPtr

HeapEnd                                                   Верхняя граница памяти
                       Рис. 2. Начальное состояние кучи
        Оператор Mark(P) помечает состояние кучи перед распределением Ptr3 (сохранением текущего
HeapPtr в P). Если выполнить оператор Release(P), то состояние кучи станет таким, как на рисунке 3 (ос-
вобождены все указатели, распределенные после вызова Mark).

Ptr1                                                      Нижняя граница памяти
                           содержимое Ptr1^
Ptr2
                           содержимое Ptr2^
HeapPtr

HeapEnd                                                   Верхняя граница памяти
               Рис.3. Распределение кучи после выполнения Release(P)

       Примечание. Выполнение оператора Release(HeapOrg) полностью очищает всю кучу, поскольку
HeapOrg указывает на нижнюю границу кучи.
       Для программ, которые освобождают указатели в порядке, точно обратном порядку их распределе-
ния, процедуры Mark и Release очень эффективны. Однако большинство программ распределяют и ос-
вобождают указатели случайным образом. Это требует более сложной техники управления и реализуется
процедурами Dispose и FreeMem. Эти процедуры позволяют программе освобождать любой указатель в
любое время.