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

UptoLike

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

Когда динамическая переменная, которая не является последней (верхней) в куче, освобождается
с помощью 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 хранятся в списке свобод-
ных блоков, который растет сверху вниз от верхней границы сегмента кучи. Когда распределяется динами-