【问题标题】:What is the alternative to FreeAndNil in Delphi 7?Delphi 7中FreeAndNil的替代品是什么?
【发布时间】:2012-05-19 17:59:30
【问题描述】:

我怀疑 FreeAndNil 是否是处置对象的理想方法。我遇到过类似

的代码
StringList1.Free; 
StringList1 := Nil;

被使用。上面的行是矫枉过正,还是更好的做事方式?这两种方法有什么区别?

【问题讨论】:

  • 我看到已经有关于这个主题的单独的 SO 讨论。因此,我认为最好关闭它。
  • 嗯,这取决于这个问题是什么。我将其视为 FreeAndNil 与此问题中的两行代码之间的区别。如果那个读数是正确的,那么这不是一个骗局。你有什么问题?
  • @DavidHeffernan:是的,你没看错。谢谢您的帮助。我理解了差异。

标签: delphi delphi-7


【解决方案1】:

您问题中的代码可能是由不了解FreeAndNil 的人编写的。或者它最初是在 FreeAndNil 添加到 RTL 之前编写的。如果您想取消引用,那么您也可以使用FreeAndNil。手写没有帮助。

唯一真正的区别是FreeAndNil 将设置对Nil 的引用,即使Free 提高。但是你的析构函数无论如何都不应该加注,所以在我看来这没什么大不了的。

FreeAndNil 有一个常见的陷阱。因为它需要一个无类型参数,所以你可以传递任何东西。例如,您可以传递一个接口、一条记录等。如果您犯了这个错误,那么您通常会遇到奇怪的运行时错误。

我不会开始讨论FreeAndNil 是否是一个合适的设计选择。该主题已在其他地方进行了深入讨论。

【讨论】:

  • +1 试图避免关于 FreeFreeAndNil 的不可避免的一般性讨论 :)
  • 我不明白您所说的“如果您想取消引用,那么您不妨使用 FreeAndNil”是什么意思。另外,如果你有什么好的参考,给个链接,我想深入了解
  • FreeAndNil 非常简单。代码说明了一切。我的观点是,如果您想释放和反对,并且将引用归零,那么请调用 FreeAndNil 而不是分两个单独的步骤进行。我真的不能说得更清楚了。
  • @naXa:我已经回滚了你的编辑。代码格式只能用于code,在文本中仅提及函数名并不能使其成为代码。
  • @naXa, KenWhite:我同意 naXa,在其他单调文本中突出显示函数名称只会有帮助。
【解决方案2】:

严格来说,要处理一个对象,您只需要调用Destroy。但是,如果引用是nil,即。尚未分配指向有效对象实例的指针,这将导致访问冲突,因此建议调用 Free 而不是首先检查传递的引用是否为 nil 并且在这种情况下不执行任何操作。 FreeAndNil 首先将传递的引用分配给一个临时局部变量,然后将nil 分配给传递的引用,然后调用Free 来处理实例。 FreeAndNil 和您的序列 obj.Free; obj := nil; 之间的唯一区别是,在第一种情况下,即使析构函数引发异常,传递的引用也是 nil

【讨论】:

  • 请注意,FreeAndNil 实际上是内部的 NilThenFree,在某些情况下顺序可能很重要。
猜你喜欢
  • 2020-10-10
  • 2022-07-14
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2019-02-22
  • 2011-05-07
  • 2012-04-24
  • 2019-12-03
相关资源
最近更新 更多