Name

Dispose Procedure

Syntax

procedure Dispose(var P: Pointer-type);
procedure Dispose(var P: ^object; Destructor);

Description

Memory that you allocate with New must be freed with Dispose. Dispose quietly ignores an attempt to free a nil pointer. If you try to free a pointer that was already freed or was not allocated by New, the results are unpredictable. Dispose is not a real procedure.

When disposing of an old-style object instance, you can also pass a destructor call as the second argument. Use the destructor name and any arguments it requires.

Tips and Tricks

  • Delphi calls Finalize for you before freeing the memory.

  • After Dispose returns, the pointer P contains an invalid value. If the pointer is not a local variable, be sure to set it to nil.

  • Call FreeMem to free memory allocated by GetMem. Call Dispose to free memory allocated by New.

Example

type
  PLink = ^TLink;
  TLink = record
    Info: string;
    Next: PLink;
    Previous: PLink;
  end;
const
  FreePattern = Pointer($BAD00BAD);

// Free a link in a doubly linked list.
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;

  // Referring to Link or Link.Next, etc., after freeing Link would
  // be an error. Help detect such errors by storing a particular
  // pointer patter in Link. If the program raises an access
  // violation, and the erroneous pointer is this pattern, the
  // problem is probably caused by a dangling reference to Link.
  Link.Next := FreePattern;
  Link.Previous := FreePattern;
  Tmp := Link;
  Link := FreePattern;
  Dispose(Tmp);
end;

See Also

Finalize Procedure, FreeMem Procedure, IsMultiThread Variable, New Procedure, Object Keyword
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset