在Delphi中,为什么在调用析构函数后,Assigned()函数仍然返回True?
以下示例代码会将“sl仍然分配”写入控制台。
但是,我可以调用FreeAndNil(sl);并且不会被分配。
我一直在Delphi编程一段时间,但这对我来说没有任何意义。
有人可以解释吗
program Project1; {$APPTYPE CONSOLE} uses SysUtils,Classes; var sl : TStringList; begin sl := TStringList.Create; sl.Free; if Assigned(sl) then WriteLn('sl is still assigned') else WriteLn('sl is not assigned'); end.
我尝试比较VCL操作… FreeAndNil是短和甜,有道理:
procedure FreeAndNil(var Obj); var P: TObject; begin P := TObject(Obj); TObject(Obj) := nil; // clear the reference before destroying the object P.Free; end;
但是TObject.Free是神秘的汇编器,我不明白:
procedure TObject.Free; asm TEST EAX,EAX JE @@exit MOV ECX,[EAX] MOV DL,1 CALL dword ptr [ECX].vmtDestroy @@exit: end;
解决方法
如果使用sl.Free,对象被释放,但是变量sl仍然指向现在无效的内存。
使用FreeAndNil(sl)来释放对象并清除指针。
顺便说一句,如果你这样做:
var sl1,sl2: TStringList; begin sl1 := TStringList.Create; sl2 := sl1; FreeAndNil(sl1); // sl2 is still assigned and must be cleared separately (not with FreeAndNil because it points to the already freed object.) end; procedure TObject.Free; asm TEST EAX,EAX JE @@exit // Jump to exit if pointer is nil. MOV ECX,[EAX] MOV DL,1 CALL dword ptr [ECX].vmtDestroy // Call cleanup code (and destructor). @@exit: end;