加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 05:24:57 所属栏目:大数据 来源:网络整理
导读:Free和FreeAndNil的基本区别是什么? FreeAndNil = Free Nil? 什么时候应该使用Free和什么时候应该使用FreeAndNil? 我不会得到这些,当goggling可以帮助我。 提前致谢。 解决方法 看到 delphibasics-FreeAndNil docwiki.embarcadero-FreeAndNil pages-free
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: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有时被分配,有时不是。)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读