在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.
Run Code Online (Sandbox Code Playgroud)
我尝试比较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;
Run Code Online (Sandbox Code Playgroud)
但TObject.Free是神秘的汇编程序,我不明白:
procedure TObject.Free;
asm
TEST EAX,EAX
JE @@exit
MOV ECX,[EAX]
MOV DL,1
CALL dword ptr [ECX].vmtDestroy
@@exit:
end;
Run Code Online (Sandbox Code Playgroud) 在我的Delphi7中这段代码
var MStr: TMemoryStream;
...
FreeAndNil(MStr);
MStr.Size:=0;
Run Code Online (Sandbox Code Playgroud)
在模块"Project1.exe"中的地址0041D6D1处生成AV:访问冲突.读取地址00000000.但是有人坚持认为不管怎么说都不应该引起任何例外.他还说他的Delphi 5确实没有例外.他称之为"陈旧的指针错误".换句话说,他说FreeAndNil不能用作调试器来检测释放对象或使用释放对象的双重尝试.
任何人都可以开导我吗?如果这个引发错误(总是/随机)或程序应该没有问题地运行这个错误?
谢谢
我问这个是因为我相信我的程序中有一个"双重免费对象"或"免费且重新访问"的错误.在释放对象后,如何用零填充分配给对象的内存?我希望这种方式通过获取和AV来检测bug的位置.最初,我希望如果我将对象设置为FreeAndNil,我将在尝试重新访问它时始终获得AV.
delphi ×2