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

前端之家收集整理的这篇文章主要介绍了如何从Delphi中的函数返回一个对象而不会导致访问冲突?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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,更清楚阅读和维护.

猜你在找的Delphi相关文章