delphi – 哪个是更好的:Free或FreeAndNil?
Free和FreeAndNil的基本区别是什么?
FreeAndNil = Free Nil? 什么时候应该使用Free和什么时候应该使用FreeAndNil? 我不会得到这些,当goggling可以帮助我。 提前致谢。 解决方法
看到
> delphibasics-FreeAndNil 并看看实现: 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:UsersAndreas RejbrandDocumentsRAD Studio6.0DemosDelphiWin32VCLWin32Footballup.bmp'); bm.Free; if Assigned(bm) then bm.SaveToFile('C:UsersAndreas RejbrandDesktoptest.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有时被分配,有时不是。) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |