11.5.2. Процедуры Dispose и FreeMem
Процедура Dispose (VAR P : Pointer ) освобождает память, занимаемую динамической переменной P^, на которую указывает ее
- 202 -
аргумент P. Эта процедура работает только с типизированными ссылочными переменными. Во избежание проблем вызовы Dispose должны быть парны вызовам New с тем же аргументом и ни в коем случае не применяться к неразмещенным ссылкам.
После выполнения процедуры Dispose значение ссылки P не определено, как и значение разыменования P^.
Для освобождения непрерывных участков памяти заданного размера нужно использовать процедуру
FreeMem( VAR Р : Pointer; Size : Word ).
Она производит освобождение участка памяти, начиная с адреса, передаваемого ей в первом параметре (ссылке или указателе P) и имеющего размер, определяемый вторым параметром (Size). При использовании процедуры FreeMem нельзя забывать, что размер освобождаемого блока должен точно соответствовать размеру, заданному при его размещении посредством GetMem или New. В противном случае либо возникнут потерянные байты, если размер блока при освобождении оказался меньше (а это мусор в памяти), либо в дальнейшем возможна потеря части данных, непосредственно примыкавших к этой области, если размер освобождаемого блока больше ранее отведенного. Последнее чревато особо неприятными последствиями.
Вызовы FreeMem, как и Dispose, в идеале должны быть парны вызовам GetMem. Хотя на практике можно использовать FreeMem вместо Dispose.
Значение ссылочной переменной P после вызова FreeMem считается неопределенным, и ссылаться на P^ в этом случае не стоит.
Если сразу за операторами Dispose или FreeMem следуют конец всей программы или оператор Halt и ему подобные, то можно, в принципе, исключить из программы эти последние процедуры освобождения. Это не совсем по правилам, но может доставить немного радости тем, кто вечно воюет с размером собственных программ. Все сказанное в этом абзаце не относится к резидентным программам.