借鉴一下高手的说法吧:
procedure TObject.Free;
asm
TEST EAX,EAX
JE @@exit
MOV ECX,[EAX]
MOV DL,1
CALL dword ptr [ECX].vmtDestroy
@@exit:
end;
Free= if Object is not nil then destory else do nothing.
在destory之后,对象所占用的空间被释放了,但是对象变量的值(就是指向对象实例空间的指针)
并没有被清空,如果对同一个对象进行两次Free,就极可能发生内存访问错误。
下面是一个例子:
procedure TForm1.q34(Sender: TObject);
var
a:TStringList;
begin
a:=TStringList.Create; //对象获得实例空间
//a.Free; //1
FreeAndNil(a); //2 如果让1有效而2无效,则会在3处出先非法内存访问错误,因为此时
//a所指向的内存已经不再属于对象
a.Free; //3
a.Destroy; //出错——试图释放一个空对象
end;