我怀疑 FreeAndNil 是否是处置对象的理想方法。我遇到过类似的代码
StringList1.Free;
StringList1 := Nil;
用来。上面的行是矫枉过正,还是更好的做事方式?这两种方法有什么区别?
严格来说,要处理一个对象,您只需要调用Destroy
. 但是,如果参考是nil
,即。尚未分配指向对象的有效实例的指针,这将导致访问冲突,因此建议先调用Free
which 来检查传递的引用是否为 nil 并且在这种情况下不执行任何操作。
FreeAndNil
首先将传递的引用分配给临时局部变量,然后分配nil
给传递的引用,然后调用Free
dispose 实例。FreeAndNil
和您的序列之间的唯一区别obj.Free; obj := nil;
是,在第一种情况下,nil
即使析构函数引发异常,传递的引用也是如此。
您问题中的代码可能是由不了解FreeAndNil
. 或者也许它最初是在FreeAndNil
添加到 RTL 之前编写的。如果您想取消引用,那么您也可以使用FreeAndNil
. 用手写的方式写出来并没有帮助。
唯一真正的区别是即使加注FreeAndNil
也会将引用设置为。但是你的析构函数无论如何都不应该加注,所以在我看来这没什么大不了的。Nil
Free
有一个常见的陷阱FreeAndNil
。因为它需要一个无类型参数,所以你可以传递任何东西。例如,您可以传递一个接口、一条记录等。如果您犯了这个错误,那么您通常会遇到奇怪的运行时错误。
我不会开始讨论是否FreeAndNil
是一个合适的设计选择。该主题已在其他地方进行了深入讨论。