Delphi 7中FreeAndNil的替代品是什么?

时间:2012-05-11 06:10:39

标签: delphi delphi-7

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

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

被使用。上述行是否过度,或者是更好的做事方式?这两种方法有什么区别?

2 个答案:

答案 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是否是一个合适的设计选择。其他地方已经深入讨论了这个话题。

相关问题