2

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

StringList1.Free; 
StringList1 := Nil;

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

4

2 回答 2

9

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

于 2012-05-11T06:34:45.637 回答
5

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

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

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

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

于 2012-05-11T06:30:15.387 回答