加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 10:18:38 所属栏目:大数据 来源:网络整理
导读:在Delphi中,为什么在调用析构函数后,Assigned()函数仍然返回True? 以下示例代码会将“sl仍然分配”写入控制台。 但是,我可以调用FreeAndNil(sl);并且不会被分配。 我一直在Delphi编程一段时间,但这对我来说没有任何意义。 有人可以解释吗 program Proje
在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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读