Delphi   发布时间:2022-04-10  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了delphi – 我应该在每个Object.Create之后放一个try-finally块吗?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我对OO Delphi的最佳实践有一个普遍的疑问.目前,我将try-finally块放在我创建对象的任何地方,以便在使用后释放该对象(以避免内存泄漏).例如.:
aObject := TObject.Create;
try
  aOBject.AProcedure();
  ...
finally
  aObject.Free;
end;

代替:

aObject := TObject.Create;
aObject.AProcedure();
..
aObject.Free;

你认为这是好的做法还是过多的开销?那表现怎么样?

解决方法

在我看来,只有一个原因是对象构造不应该遵循( or “in” as Mason pointed out)try / finally块.

>如果对象的生命周期由另一个对象管理.

这种管理可以采取三种形式:

>对象的引用具有超出本地块的范围,并在其他地方释放 – 就像在析构函数中释放的字段成员一样.
>一个对象立即添加到一个列表中,该列表稍后负责释放该对象.
>具有关联生命周期管理器的对象,就像在构造时将所有者传递给VCL控件一样.

对于#1,当引用具有更宽的范围时,如果不立即构造引用,则应立即将引用设置为nil.这样,当检查参时,您知道您有准确的读数.这对于构造为较大类的一部分的成员对象最常见,然后在销毁父对象时进行清理.

对于#2,当一个对象被添加到列表中时,你想要使用一个try-except块(我用过的几次之一),以防万一在构造对象之后和添加到对象之前发生异常.管理清单.理想情况下,构造后的第一行是将其添加到列表中,或者列表实际上是一个工厂类,它为您提供已添加到列表中的对象.

对于#3,当一个对象有另一个生命周期管理器时,你真的应该确保由该管理器管理它是正确的事情.如果你正在构建一个VCL控件,你可能会想让表单(或任何其他控件)拥有它,但这实际上会给构造和破坏带来额外的开销.如果可能的话,你应该明确地释放它,如果你把控件放在一次,那么你知道你将在你的表单的析构函数中或者它关闭时释放它,尤其如此.唯一不能做到这一点的是控件创建是否更具动态性.

所以是的,使用大量的try / finally块是最好的做法.您应该只有几个try / except块,并且大多数都应该捕获非常特定的异常类型,和/或重新引发异常.如果你有更多尝试/除了try / finally块,那么你做错了.

大佬总结

以上是大佬教程为你收集整理的delphi – 我应该在每个Object.Create之后放一个try-finally块吗?全部内容,希望文章能够帮你解决delphi – 我应该在每个Object.Create之后放一个try-finally块吗?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。