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 ...

Get Delphi in a Nutshell now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.