除了this问题,我对文档注解做了一些测试和研究。我的结论是,这种代码应该没有内存泄漏的工作:德尔福函数返回类对象
function testResultObject: TClassA;
begin
Result := TClassA.Create;
Result.DoSomething;
end;
然后某处,我可以调用这个方法,从上述代码:
var k: TClassA;
begin
k := testResultObject;
try
//code code code
finally
k.Free;
end;
end;
由于雷米在它的最好的答案建议避免这种做事的方式,而改用testResultObject(x: TClassA): boolean
之类的东西。在这种情况下,返回true/false可以告诉我是否一切正常,并且传递已创建的对象。
看看这段代码:
function testResultObject: TClassA;
begin
Result := TClassA.Create;
try
Result.DoSomething;
except
Result.Free;
end;
end;
与第一个版本以上的功能的问题是,DoSomething
可能引发一个异常,如果是的话,我会泄漏内存。第二次执行try-except
可以解决吗?当然,我将不得不检查结果是否被赋值,否则为零。
我同意(如上所述)testResultObject(x: TClassA): boolean
会更好。我只是想知道是否可以像我写的那样修复返回类功能的方式。
就我个人而言,我一直使用第二种方法(真/假返回),它更好,使代码更具可读性。你的解决方案很好,但你应该在异常块中添加一个结果:= nil –
你误解了我以前的答案。当您修改该对象时(在该示例中,将项目添加到列表中),传递对象作为参数是很好的。这是一个完全不同的场景。 –