Delphi函数返回类对象
发布时间:2020-12-15 09:43:34 所属栏目:大数据 来源:网络整理
导读:除了 this问题,我还对docwiki进行了一些测试和研究.我的结论是这种代码应该没有内存泄漏: function testResultObject: TClassA;begin Result := TClassA.Create; Result.DoSomething;end; 然后我可以用这种方式调用上面的代码: var k: TClassA;begin k :=
除了
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; 正如Remy在答案中建议的那样,最好避免这种做法,而是使用像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会更好.我只是想知道返回类功能的方式是否可以像我写的那样修复. 解决方法
您的代码存在严重问题.如果出现错误,它会吞下异常,并返回无效的对象引用.
这很容易解决.规范方式如下: function testResultObject: TClassA; begin Result := TClassA.Create; try Result.DoSomething; except Result.Free; raise; end; end; 函数成功并返回一个新对象.或者它失败了,自行清理,并引发异常. 换句话说,此函数的外观和行为就像构造函数一样.您以相同的方式使用它: obj := testResultObject; try // do things with obj finally obj.Free; end; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |