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

如何从Delphi中的函数返回一个对象而不会导致访问冲突?

发布时间:2020-12-15 10:09:50 所属栏目:大数据 来源:网络整理
导读:我有一个delphi函数返回一个TStringList,但是当我返回一个值并尝试使用它时,我得到一个访问冲突错误,即 myStringList := FuncStringList();myStringList.Items.Count // -- This causes an access violation// function FuncStringListfunction FuncStringLi
我有一个delphi函数返回一个TStringList,但是当我返回一个值并尝试使用它时,我得到一个访问冲突错误,即
myStringList := FuncStringList();
myStringList.Items.Count   // <-- This causes an access violation

// function FuncStringList
function FuncStringList:TStringList;
var
  vStrList:TStringList;
begin

  vStrList := TStringList.Create;
   ...
  // Fill the vStrList

  Result := vStrList 
  vStrList.Free;    //<- when i free here,this function will cause AccessViolation
end;

如何返回TStringList并仍然在本地函数中释放它?

解决方法

当Smasher说,你不能释放它;调用返回对象的函数的代码负责销毁它.

这是错误的代码设计,顺便说一下,因为它使得混淆了谁分配和释放.一个更好的方法是让调用者创建对象并将其传递给函数.这样,创建它的代码也可以释放它.这样的事情

var
  SL: TStringList;
begin
  SL := TStringList.Create;
  try
    ProcToFillStringList(SL);
    //Do something with populated list
  finally
    SL.Free;
  end;
end;

// Note I've made the parameter a TStrings and not a TStringList. This allows
// passing a TMemo.Lines or a TListBox or TComboBox Items as well.
procedure ProcToFillStringList(const SList: TStrings);
  // Do whatever populates the list with SList.Add()
end;

现在不会有什么混乱的 – 创建对象的相同代码负责释放它.而代码,IMO,更清楚阅读和维护.

(编辑:李大同)

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

    推荐文章
      热点阅读