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