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有时被分配,有时不是。)