Dispose, процедура

Синтаксис


procedure Dispose(var P:   Тип указателя);
procedure Dispose(var P: ^object; Деструктор);

Описание

Память, выделенная с помощью процедуры New, должна быть освобождена процедурой Dispose, которая игнорирует попытку освободить нулевой указатель. Если вы попытаетесь освободить указатель, который уже был освобожден или не был выделен с помощью процедуры New, результат непредсказуем. Dispose не является настоящей процедурой.
При освобождении экземпляра "старого" объекта также можно указать в качестве второго аргумента деструктор. Используйте имя деструктора и любое количество необходимых аргументов.

Ошибки

Советы и приемы

  • До освобождения памяти Delphi вызывает процедуру Finalize.
  • После окончания работы Dispose указатель Р содержит недопустимую величину. Если указатель не является локальной переменной, обязательно обнулите его.
  • Освобождайте память, выделенную процедурой GetMem, с помощью процедуры FreeMem. Используйте процедуру Dispose только для памяти, выделенной процедурой New.

Пример


type
PLink = ^TLink;
TLink = record
Info: string;
Next: PLink;
Previous: PLink;
end;
const
FreePattern = Pointer($BAD00BAD);
// Уничтожение связанного элемента двусвязного списка.
procedure FreeLink(var Link: PLink);
var
Tmp: PLink;
begin
if Link.Previous <> nil then
Link.Previous.Next := Link.Next;
if Link.Next <> nil then
Link.Next.Previous := Link.Previous;
// Ссылка на Link или Link.Next и т. п. после уничтожения Link
// будет ошибкой. Облегчим поиск подобных ошибок, записав
// в Link определенное фиктивное значение. Если программа вызывает
// исключительную ситуацию, и ошибочный указатель равен этому
// значению, проблема наверняка вызвана "висящей" ссылкой на
// Link.
Link.Next := FreePattern; Link.Previous := FreePattern; Tmp := Link; Link := FreePattern; Dispose(Tmp); end;

Смотрите также

Процедуры Finalize, FreeMem, New.
    Учебник по языку Pascal          Лабораторные работы по программированию          Справочник




Нет комментариев.



Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: