In the following example:
program DisposeProblem;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
Person = record
name: string;
age: Integer;
end;
var
p: ^Person;
begin
p := nil;
Dispose(nil); // OK
Dispose(p); // AV
end.
Why is the first Dispose()
call OK, while the second causes an access violation error? When I step through the code, the first Dispose()
calls System._FreeMem()
, while the second calls System._Dispose()
, but I don't understand why this is the case. I would like to understand this behavior so I can know when it is safe to call Dispose()
on a nil
pointer.