为什么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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |