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

在Delphi 5中,Free可以提出异常吗?

发布时间:2020-12-15 04:12:07 所属栏目:大数据 来源:网络整理
导读:在Delphi 5中,我目前编写的代码在finally块中的多个变量上调用Free,例如: ...finally a.Free; b.Free; c.Free;end; 此代码假定Free永远不会引发,因为例如,如果a.Free引发,则b和c的内存将被泄露.这个假设是否合理? 解决方法 Free方法本身没有显式引发异常,
在Delphi 5中,我目前编写的代码在finally块中的多个变量上调用Free,例如:
...
finally
    a.Free;
    b.Free;
    c.Free;
end;

此代码假定Free永远不会引发,因为例如,如果a.Free引发,则b和c的内存将被泄露.这个假设是否合理?

解决方法

Free方法本身没有显式引发异常,但它调用了虚拟析构函数Destroy,这肯定会引发异常.

因此,如果您想确保所有对象都被销毁,即使其中一个析构函数引发异常,您最终会得到如下代码:

a := TMyObject.Create;
try
  b := TMyObject.Create;
  try
    ...
  finally
    b.Free;
  end;
finally
  a.Free;
end;

话虽如此,它应该是一个设计原则,你不要在析构函数中引发异常.所以,在我看来,采取这样的观点是完全合理的,即如果在析构函数中引发异常,那么你的程序几乎就是软件.此时泄漏的物体不值得担心.如果你的析构函数引发了异常,那么你可能已经泄漏了,因为析构函数没有运行完成.

所以在我看来,将一些调用组合在一起是完全合理的,当然你要避免深度嵌套的try / finally,这是值得努力的事情.

如果您只想尝试一次/ finally,那么请记住编写如下代码:

a := nil;
b := nil;
try
  a := TMyObject.Create;
  b := TMyObject.Create;
  ...
finally
  b.Free;
  a.Free;
end;

在我自己的代码库中,我有一些帮助方法,使这个更清洁.然后代码看起来像这样:

InitialiseNil(a,b);
try
  a := TMyObject.Create;
  b := TMyObject.Create;
  ...
finally
  FreeAndNil(b,a);
end;

我给了我的FreeAndNil与SysUtils中的函数同名,乍一看可能看起来很奇怪,但这样做是安全和良性的.当你有两个以上的物体时,这些助手自然会自成一体.

(编辑:李大同)

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

    推荐文章
      热点阅读