Dispose Procedure
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.
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
.
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;