首先,在大多数情况下,FreeAndNil 有点矫枉过正。当您在析构函数之外或在全局(丑陋)变量上释放对象的字段时,这很方便。但大多数时候,只需拨打免费电话就足够了。
如您所知,对象变量实际上是指向对象数据的指针。当您调用 Free 时,该缓冲区被释放(当然,在析构函数运行之后),但 Object 变量仍然指向刚刚释放的内存位置。它被称为“悬空指针”。只要您知道它在该上下文中悬空,拥有悬空指针就不是问题。举个例子:
Procedure Myproc;
var vString : TStringList;
begin
//Here, vString is "dangling"
vString := TStringList.Create;
//Here, vString is valid
try
//Do some stuff
finally
vString.Free;
end;
//Here, vString is "dangling"... But who care, it's about to go out of scope and we won't use it again.
end;
在您不确切知道何时或如何释放变量的全局变量上调用 FreeAndNil 更有意义。话虽如此,一直调用 FreeAndNil 并没有错(除非在非常紧凑的循环中,您试图获得每一盎司的性能)。
现在,对于 COM 对象......就像 Mason 所说,它们是引用计数的。因此,如果您持有对该接口的唯一引用,则调用MyInterface := nil;
将释放它。但是当/如果变量超出范围时,编译器会添加清理代码以确保接口引用减少。因此,如果您试图将内存要求保持在最低限度,请将接口设置为 nil。否则,没那么重要。
至于您的数组...您可以在列表中的每个项目上调用 Free... Optionnaly 将它们设置为 nil 之后。