gpt4 book ai didi

delphi - 在 Delphi 5 中,Free 可以引发异常吗?

转载 作者:行者123 更新时间:2023-12-03 14:50:28 28 4
gpt4 key购买 nike

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

...
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;

我给我的 FreeAndNil 赋予了与 SysUtils 中的函数相同的名称,乍一看可能看起来很奇怪,但这样做是安全且良性的。当您有两个以上的对象时,这些助手自然会发挥作用。

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com