加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读