gpt4 book ai didi

错误时释放资源的 goto 链的 OOP 等价物?

转载 作者:行者123 更新时间:2023-12-03 18:05:39 26 4
gpt4 key购买 nike

在 C 语言中,我使用 goto 链在出错时释放资源,正如推荐的那样 here .使用 Delphi 我遇到了以下情况,我想优雅地处理内存耗尽并防止内存泄漏:

New(A);
A.DoSomething;
New(A.B);
A.B.DoSomething;
New(A.C);
A.C.DoSomething;

据我所知,检查内存耗尽的方法是捕获 New 抛出的异常。假设 DoSomething 函数都在出错时抛出 Exception。 SEI CERT 的编码标准建议反对in-band error checking反对using exceptions for control flow ,至少对于 Java,我觉得这是非常合理的。我不确定如何处理这种情况,同时牢记这些建议。我的想法是做类似的事情

function AllocStuff : TA;
begin
New(Result);
Result.B := nil;
Result.C := nil;
Result.DoSomething;
New(Result.B);
Result.B.DoSomething;
New(Result.C);
Result.C.DoSomething;
end;

捕获调用者的异常:

procedure QuestionableControlFlow;
var
A : TA;
begin
A := nil;
try
A := AllocStuff;
DoSomethingWith(A);
Dispose(A);
except on E : Exception do
begin
if (A <> nil) then
begin
if (A.B <> nil) then
begin
if (A.C <> nil) then
begin
Dispose(A.C);
end;
Dispose(A.B);
end;
Dispose(A);
end;
end;
end;

事情有那么糟糕吗?将 gotoexcept 混合使用似乎更糟糕,这是我目前所能想到的。

最佳答案

在 Delphi 中,您使用 try/finally 实现非托管资源生命周期。

例如

obj := TObject.Create;
try
obj.DoSomething;
finally
obj.Free;
end;

你绝对不要为此使用try/except,尽管这是一个常见的错误。这是为了处理不同于保证最终确定的异常。

当您需要在一个函数中处理多个非托管资源时,您可以嵌套 try/finally block 。当嵌套很深时,可能会很乱。可以在此处找到处理该问题的一些想法:Avoiding nested try...finally blocks in Delphi

关于错误时释放资源的 goto 链的 OOP 等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50537089/

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