在Delphi 5中,Free可以提出例外吗?

Stu*_*etz 7 delphi exception-handling delphi-5

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

...
finally
    a.Free;
    b.Free;
    c.Free;
end;
Run Code Online (Sandbox Code Playgroud)

这段代码假设Free永远不会引发,因为,例如,如果a.Free提出,内存bc将被泄露.这个假设是否合理?

Dav*_*nan 11

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

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

a := TMyObject.Create;
try
  b := TMyObject.Create;
  try
    ...
  finally
    b.Free;
  end;
finally
  a.Free;
end;
Run Code Online (Sandbox Code Playgroud)

话虽如此,它应该是一个设计原则,你不要在析构函数中引发异常.所以,在我看来,采取这样的观点是完全合理的,即如果在析构函数中引发异常,那么你的程序几乎就是软件.在这一点上泄漏的物体并不值得担心.如果你的析构函数引发了异常,那么你可能已经泄漏了,因为析构函数没有运行完成.

因此,在我看来,将一些调用组合在一起是完全合理的Free,当然,你避免深度嵌套try/ finally这是值得努力的事情.

如果你只想一个try/ finally然后记得写这样的代码:

a := nil;
b := nil;
try
  a := TMyObject.Create;
  b := TMyObject.Create;
  ...
finally
  b.Free;
  a.Free;
end;
Run Code Online (Sandbox Code Playgroud)

在我自己的代码库中,我有一些帮助方法,使这个更清洁.然后代码看起来像这样:

InitialiseNil(a, b);
try
  a := TMyObject.Create;
  b := TMyObject.Create;
  ...
finally
  FreeAndNil(b, a);
end;
Run Code Online (Sandbox Code Playgroud)

我给出FreeAndNil了与SysUtils乍一看可能看起来奇怪的功能相同的名称,但这样做是安全和良性的.当你有两个以上的物体时,这些助手自然会自成一体.