我怀疑FreeAndNil是否是处理对象的理想方法。我遇到过像
这样的代码StringList1.Free;
StringList1 := Nil;
被使用。上述行是否过度,或者是更好的做事方式?这两种方法有什么区别?
答案 0 :(得分:9)
严格来说,处理对象只需要调用Destroy
。但是,如果引用是nil
,即。没有为对象的有效实例分配指针,这会导致访问冲突,因此建议调用Free
而不是先检查传递的引用是否为nil,在这种情况下什么都不做。
FreeAndNil
首先将传递的引用分配给临时局部变量,然后将nil
分配给传递的引用,然后调用Free
来处置实例。 FreeAndNil
和您的序列obj.Free; obj := nil;
之间的唯一区别在于,在第一种情况下,即使析构函数引发异常,传递的引用也将是nil
。
答案 1 :(得分:5)
您问题中的代码可能是由不了解FreeAndNil
的人编写的。或者它最初是在FreeAndNil
添加到RTL之前编写的。如果您想要参考,那么您也可以使用FreeAndNil
。写出来并没有帮助。
唯一真正的区别是即使FreeAndNil
加注,Nil
也会将引用设置为Free
。但是你的析构师永远不应该提出,所以在我看来这不是什么大不了的事。
FreeAndNil
有一个共同陷阱。因为它需要一个无类型的参数,你可以传递任何东西。例如,您可以传递接口,记录等。如果您犯了这个错误,那么通常会出现奇怪的运行时错误。
我不打算开始考虑FreeAndNil
是否是一个合适的设计选择。其他地方已经深入讨论了这个话题。