【发布时间】:2017-08-25 12:39:26
【问题描述】:
除了this的问题,我在docwiki上做了一些测试和研究。我的结论是这种代码应该可以在没有内存泄漏的情况下工作:
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 的第二个实现可以解决吗?以后肯定会检查结果是赋值还是 nil。
我同意(如上所述)testResultObject(x: TClassA): boolean 会更好。我只是想知道 return-a-class 函数方式是否可以像我写的那样修复。
【问题讨论】:
-
就个人而言,我一直使用第二种方法(真/假返回),这种方法更好并且使代码更具可读性。您的解决方案很好,但您还应该在异常块中添加 Result := nil
-
您误解了我之前的回答。当您修改该对象(在该示例中,将项目添加到列表中)时,将对象作为参数传递是很好的。这是一个完全不同的场景。
标签: delphi