相关疑难解决方法(0)

为什么即使在调用后也分配了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.
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)

delphi

24
推荐指数
2
解决办法
1万
查看次数

在FreeAndNil之后使用对象时会发生什么?

在我的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

8
推荐指数
4
解决办法
2113
查看次数

标签 统计

delphi ×2