在Delphi 5中,我目前编写了在Free块中的多个变量上调用finally的代码,例如

...
finally
    a.Free;
    b.Free;
    c.Free;
end;

该代码假定Free永远不会升高,因为例如,如果a.Free升高,则bc的内存将被泄漏。这个假设合理吗?

最佳答案

Free方法本身不会显式引发异常,但是会调用虚拟析构函数Destroy,这肯定会引发异常。

因此,如果您想确保所有对象都被销毁,即使其中一个析构函数引发异常,您最终也会得到如下代码:

a := TMyObject.Create;
try
  b := TMyObject.Create;
  try
    ...
  finally
    b.Free;
  end;
finally
  a.Free;
end;

话虽如此,这应该是一个设计原则,即不要在析构函数中引发异常。因此,在我看来,以这样的观点是完全合理的:如果在析构函数中引发异常,那么您的程序就几乎可以正常工作了。此时无需担心物体泄漏。如果析构函数引发异常,那么您可能已经在泄漏,因为该析构函数没有运行完毕。

因此,在我看来,将对Free的某些调用组合在一起是完全合理的,当然,您应该避免深层嵌套的try/finally,这是值得努力的事情。

如果只需要一个try/finally,则请记住编写如下代码:
a := nil;
b := nil;
try
  a := TMyObject.Create;
  b := TMyObject.Create;
  ...
finally
  b.Free;
  a.Free;
end;

在我自己的代码库中,我有一些帮助程序的方法可以使它变得更干净。然后,代码如下所示:
InitialiseNil(a, b);
try
  a := TMyObject.Create;
  b := TMyObject.Create;
  ...
finally
  FreeAndNil(b, a);
end;

我给了FreeAndNilSysUtils中的函数相同的名称,乍一看似乎很奇怪,但是这样做是安全和有益的。当您有两个以上的对象时,这些帮助者自然会发挥作用。

关于delphi - 在Delphi 5中,Free可以引发异常吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9191072/

10-13 07:14