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提出,内存b和c将被泄露.这个假设是否合理?
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乍一看可能看起来奇怪的功能相同的名称,但这样做是安全和良性的.当你有两个以上的物体时,这些助手自然会自成一体.