delphi – 哪个是更好的:Free或FreeAndNil?

前端之家收集整理的这篇文章主要介绍了delphi – 哪个是更好的:Free或FreeAndNil?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Free和FreeAndNil的基本区别是什么?

FreeAndNil = Free Nil?

什么时候应该使用Free和什么时候应该使用FreeAndNil?

我不会得到这些,当goggling可以帮助我。

提前致谢。

解决方法

看到

> delphibasics-FreeAndNil
> docwiki.embarcadero-FreeAndNil
> pages-freeandnil
> eurekalog-freeandnil
> blogs.embarcadero
> …

并看看实现:

procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;

例子

考虑下面的代码

procedure TForm1.FormCreate(Sender: TObject);
var
  bm: TBitmap;
begin
  bm := TBitmap.Create;
  bm.LoadFromFile('C:\Users\Andreas Rejbrand\Documents\RAD Studio\6.0\Demos\DelphiWin32\VCLWin32\Football\up.bmp');
  bm.Free;

  if Assigned(bm) then
    bm.SaveToFile('C:\Users\Andreas Rejbrand\Desktop\test.bmp')
  else
    ShowMessage('Cannot save! The bitmap does no longer exist!');
end;

这将在我的桌面上创建一个错误或无效(空)位图,因为我尝试使用已释放的对象。是的,即使bm已经被释放,它仍然被“分配”,即bm仍然指向内存地址,即使没有什么(可用)。为了克服这个问题,可以设置bm:= nil作为安全措施,然后赋值(bm)将返回false。或多或少,FreeAndNil(bm)是bm.Free的简写; bm:= nil。第一个语句释放所有内存(和对象使用的操作系统资源,cpu时间等),bm:= nil将“指针”bm设置为nil,使得bm不再指向对象所在的位置,但不再是。这样你(和例程分配)不会被欺骗,相信还有一个位图对象。

讨论

有人说你应该总是使用FreeAndNil(foo)而不是foo.Free。那么,为什么不呢?附加指令foo:= nil可能不会花费太多的纳秒来执行,而实际上赋值(foo)= false是被释放对象的一个​​很好的属性。但是再次,如果你知道你在做什么,并且知道你将永远不会使用foo对象后释放它,然后你可以坚持只是foo.free。真的,有些人会认为,在许多情况下(但不是全部),试图使用一个释放对象的变量是一个bug本身。 (当然有一些情况下,你有意这样做 – 你有一个对象foo有时被分配,有时不是。)

猜你在找的Delphi相关文章