ВУЗ:
Составители:
Рубрика:
Когда динамическая переменная, которая не является последней (верхней) в куче, освобождается
с помощью Dispose или FreeMem, куча становится фрагментированной. Если была выполнена та же по-
следовательность операторов, а затем Dispose(Ptr3) - в середине кучи появится дырка (рис. 4).
Если сейчас выполнить New(Ptr3), то он снова займет ту же область памяти. С другой стороны, выпол-
нение Dispose(Ptr4) увеличит
свободный блок, поскольку Ptr3 и Ptr4 были соседними блоками (рис. 5).
Наконец, выполнение Dispose(Ptr5) во-первых создаст еще больший свободный блок, а затем
переместит HeapPtr вниз. Кроме того, этот свободный блок сольется со свободной памятью кучи, так как
последний значащий указатель сейчас - Ptr2 (рис. 6).
Куча сейчас в таком же состоянии, как была после выполнения Release(P) (рис. 2).
Однако, свобод-
ные блоки, создаваемые и разрушаемые в этом режиме, фиксировались для последующего использования.
10. Список свободных блоков
Адреса и размеры свободных блоков, создаваемых Dispose и FreeMem хранятся в списке свобод-
ных блоков, который растет сверху вниз от верхней границы сегмента кучи. Когда распределяется динами-
Ptr1 Нижняя граница памяти
содержимое Ptr1^
Ptr2
содержимое Ptr2^
Ptr4
содержимое
Ptr4^
Ptr5
содержимое Ptr5^
HeapPtr
HeapEnd Верхняя граница памяти
Рис. 4. "Дырка" в куче
Ptr1 Нижняя граница памяти
содержимое Ptr1^
Ptr2
содержимое Ptr2^
Ptr5
содержимое Ptr5^
HeapPtr
HeapEnd Верхняя граница памяти
Рис. 5. Увеличение свободного блока
Ptr1 Нижняя граница памяти
содержимое Ptr1^
Ptr2
содержимое Ptr2^
HeapPtr
HeapEnd Верхняя граница памяти
Рис. 6. Удаление свободного блока
Когда динамическая переменная, которая не является последней (верхней) в куче, освобождается с помощью Dispose или FreeMem, куча становится фрагментированной. Если была выполнена та же по- следовательность операторов, а затем Dispose(Ptr3) - в середине кучи появится дырка (рис. 4). Ptr1 Нижняя граница памяти содержимое Ptr1^ Ptr2 содержимое Ptr2^ Ptr4 содержимое Ptr4^ Ptr5 содержимое Ptr5^ HeapPtr HeapEnd Верхняя граница памяти Рис. 4. "Дырка" в куче Если сейчас выполнить New(Ptr3), то он снова займет ту же область памяти. С другой стороны, выпол- нение Dispose(Ptr4) увеличит свободный блок, поскольку Ptr3 и Ptr4 были соседними блоками (рис. 5). Ptr1 Нижняя граница памяти содержимое Ptr1^ Ptr2 содержимое Ptr2^ Ptr5 содержимое Ptr5^ HeapPtr HeapEnd Верхняя граница памяти Рис. 5. Увеличение свободного блока Наконец, выполнение Dispose(Ptr5) во-первых создаст еще больший свободный блок, а затем переместит HeapPtr вниз. Кроме того, этот свободный блок сольется со свободной памятью кучи, так как последний значащий указатель сейчас - Ptr2 (рис. 6). Ptr1 Нижняя граница памяти содержимое Ptr1^ Ptr2 содержимое Ptr2^ HeapPtr HeapEnd Верхняя граница памяти Рис. 6. Удаление свободного блока Куча сейчас в таком же состоянии, как была после выполнения Release(P) (рис. 2). Однако, свобод- ные блоки, создаваемые и разрушаемые в этом режиме, фиксировались для последующего использования. 10. Список свободных блоков Адреса и размеры свободных блоков, создаваемых Dispose и FreeMem хранятся в списке свобод- ных блоков, который растет сверху вниз от верхней границы сегмента кучи. Когда распределяется динами-
Страницы
- « первая
- ‹ предыдущая
- …
- 8
- 9
- 10
- 11
- 12
- …
- следующая ›
- последняя »