为什么Delphi对象分配甚至在调用.Free?

前端之家收集整理的这篇文章主要介绍了为什么Delphi对象分配甚至在调用.Free?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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;
原文链接:https://www.f2er.com/delphi/103542.html

猜你在找的Delphi相关文章