我有一个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;