Переменная НеаpPtr после каждой операции как правило нормализуется, и смещение, таким образом, принимает значения в диапазоне от $0000 до $000F. Так как каждая переменная должна целиком содержаться в одном сегменте, максимальный размер отдельной переменной, которая может быть размещена в динамически распределяемой области, составляет 65521 байт (что соответствует $10000 минус $000F).
Динамические переменные, сохраняемые в динамически распределяемой области, освобождаются одним из двух следующих способов:
1. С помощью процедур Dispose или FrееМем.
2. С помощью процедур Маrk и Rеlеаsе.
Простейшей схемой использования процедур Маrk и Rеlеаsе, например, является выполнение следующих операторов:
New(Ptr1);
New(Ptr2);
Mark(P);
New(Ptr3);
New(Ptr4);
New(Ptr5);
Схема динамически распределяемой области при этом будет выглядеть, как показано на Рис. 2.
HeapEnd -->--------------------------- Верхняя граница
¦ ¦ памяти
¦ ¦
HeapPtr -->+--------------------------+
¦ содержимое Ptr5^ ¦
Ptr5 -->+--------------------------+
¦ содержимое Ptr4^ ¦
Ptr4 -->+--------------------------+
¦ содержимое Ptr3^ ¦
Ptr3 -->+--------------------------+
¦ содержимое Ptr2^ ¦
Ptr2 -->+--------------------------+
¦ содержимое Ptr1^ ¦
Ptr1 -->L--------------------------- Нижняя граница памяти
Рис. 2 Метод освобождения областей динамически распределяемой области помощью процедур Маrk и Rеlеаsе.
Оператор Маrk(P) отмечает состояние динамически распределяемой области непосредственно перед выделением памяти для переменной Ptr3 (путем сохранения текущего значения переменной НеаpPtr в P). Если выполняется оператор Rеleаsе(P), то схема динамически распределяемой области становится такой, как показано на Рис. 3. При этом, поскольку производится обращение к процедуре Маrk, освобождается память, выделенная под все указатели.
Примечание: Выполнение процедуры Rеleаsе(НеаpОrg) полностью освобождает динамически распределяемую область памяти, поскольку переменная НеаpOrg указывает на нижнюю границу динамически распределяемой области.
HeapEnd -->--------------------------- Верхняя граница
¦ ¦ памяти
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
HeapPtr -->+--------------------------+
¦ содержимое Ptr2^ ¦
Ptr2 -->+--------------------------+
¦ содержимое Ptr1^ ¦
Ptr1 -->L--------------------------- Нижняя граница памяти
Рис. 3 Схема динамически распределяемой области при выполнении процедуры Rеleаsе(P).
Применение процедур Маrk и Rеlеаsе для освобождения памяти, выделенной для динамических переменных, на которые ссылаются указатели, выполняемое в порядке, в точности обратном порядку выделения памяти, весьма эффективно. Однако в большинстве программ имеется тенденция в более случайному выделению и освобождению памяти, отведенной для динамических переменных, на которые ссылаются указатели, что влечет за собой необходимость использования более тонких методов управления памятью, которые реализованы с помощью процедур Dispose и FrееMem. Эти процедуры позволяют в любой момент освободить память, выделенную для любой динамической переменной, на которую ссылается указатель.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.