ВУЗ:
Составители:
Рубрика:
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. Эти процедуры позволяют программе освобождать любой указатель в любое время.
Страницы
- « первая
- ‹ предыдущая
- …
- 7
- 8
- 9
- 10
- 11
- …
- следующая ›
- последняя »