Borland Pascal. Руководство пользователя


         

и GetMem, процедура FreeMem воспринимает


Как и GetMem, процедура FreeMem воспринимает два параметра: освобождаемую переменную и объем освобождаемой памяти. Важно, чтобы объем освобождаемой памяти точно совпадал с объемом выде- ленной памяти. New и Dispose, основываясь на типе указателя, всегда знают, сколько байт нужно выделять или освобождать. Но в случае GetMem и FreeMem объем выделяемой памяти находится всецело под вашим контролем.

Если вы освободите меньше байт, чем было выделено, то остав- шиеся байты теряются (происходит "утечка" динамически распределя- емой памяти). Если вы освободите большее число байт, чем было вы- делено, то можете освободить память, распределенную для другой переменной, что может привести к порче данных. В защищенном режи- ме освобождение большего объема памяти, чем было выделено, вызо- вет ошибку по нарушению защиты (GP).

Предположим, например, что вы собираетесь выделить память для одной или более записей данных типа TCheck:

type PCheck = ^ TCheck; TCheck = record Amount: Real; Mounth: 1..12;

Day: 1..31; Year: 1990..2000; Payee: string[39]; end.

Пример 8.5 Простой тип записи.

Каждая запись типа TCheck занимает 50 байт, поэтому, если у вас есть переменная ThisCheck типа PCheck, вы можете распределить динамическую запись следующим образом:

GetMem(ThisGheck, 50);

а позднее освободить ее с помощью вызова:

FreeMem(ThisCheck, 50);

Использование с процедурой GetMem функции SizeOf

Однако убедиться, что вы каждый раз выделяете и освобождаете один и тот же объем памяти, недостаточно. Вы должны обеспечить распределение правильного объема памяти. Предположим, вы изменили определение TCheck. Например, если вы переопределили TCheck.Payee как 50-символьную строку вместо 39-символьной, то не сможете по- лучить и освобождать достаточно памяти. Надежнее всего использо- вать в программе функцию SizeOf, например:

GetMem(ThisCheck, SizeOf(TCheck)); . . .

FreeMem(ThisCheck, SizeOf(TCheck));

Это не только обеспечивает, что вы выделяете и освобождаете один и тот же объем, но гарантирует, что при изменении размера типа ваша программа все равно будет выделять нужную память.


Содержание  Назад  Вперед