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