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



         

Процедуры GetMem и FreeMem


Иногда нежелательно выделять память тем способом, как это делает New. Вам может потребоваться выделить больше или меньше памяти, чем это делает New по умолчанию, либо до начала выполне- ния вы можете просто не знать, сколько памяти вам нужно использо- вать. Borland Pascal выполняет такое распределение с помощью про- цедуры GetMem.

Процедура GetMem воспринимает два параметра: переменную-ука- затель, для которой вы хотите распределить память, и число расп- ределяемых байт.

Динамическое выделение памяти для строки

Пусть, например, у вас есть прикладная программа, которая считывает 1000 строк из файла и записывает их в динамическую па- мять. Вы не знаете, насколько длинной будет каждая из этих строк, поэтому вам потребуется описать строковый тип такого размера, который будет соответствовать максимальной возможной строке. Если предположить, что не все строки имеют максимальную длину, то у вас будет бесполезно использоваться память.

Чтобы решить эту проблему, вы можете считать каждую строку в буфер, затем выделить столько памяти, сколько требуется для фак- тических данных в строке. Пример этого показан ниже:

type PString = ^String;

var ReadBuffer: String; LinewRead: array[1..1000] of PString; TheFile: Text; LineNumber: Integer;

begin Assign(TheFile, 'FOO.TXT'); Reset(TheFile); for LineNumber := 1 to 1000 do begin Readln(ReadBuffer); GetMem(LinesRead[LineNumber], Length(ReadBuffer) + 1); LinesRead[LineNumber]^ := ReadBuffer; end; end.

Пример. 8.4 Динамическое распределение памяти для строки.

Вместо выделения для строк 256К (256 символов на строку 1000 раз) вы выделили 4К (4 байта на указатель 1000 раз), плюс объем, фактически занимаемый текстом.

Освобождение выделенной памяти

Аналогично тому, как требуется освобождать память, выделен- ную с помощью New, вам нужно освобождать память, распределенную с помощью процедуры GetMem. Это можно сделать с помощью процедуры FreeMem. Аналогично тому, как каждому вызову New должен соответс- твовать парный вызов Dispose, каждому вызову процедуры GetMem должен соответствовать вызов FreeMem.




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