在这里,我提供简单的代码.
function GetStringList:TStringList;
var i:integer;
begin
Result:=TStringList.Create;
Result.Add('Adam');
Result.Add('Eva');
Result.Add('Kain');
Result.Add('Abel');
end;
procedure ProvideStringList(SL:TStringList);
var i:integer;
Names:TStringList;
begin
Names:=TStringList.Create;
Names.Add('Adam');
Names.Add('Eva');
Names.Add('Kain');
Names.Add('Abel');
SL.Assign(Names);
Names.Free;
end;
procedure TForm1.btn1Click(Sender: TObject);
var SL:TStringList;
i:integer;
begin
SL:=TStringList.Create;
SL.Assign(GetStringList);
for i:=0 to 3 do ShowMessage(SL[i]);
SL.Free;
end;
procedure TForm1.btn2Click(Sender: TObject);
var SL:TStringList;
i:integer;
begin
SL:=TStringList.Create;
ProvideStringList(SL);
for i:=0 to 3 do ShowMessage(SL[i]);
SL.Free;
end;
Run Code Online (Sandbox Code Playgroud)
现在的问题是:函数GetStringList中的结果对象会发生什么:Tstringlist,它被创建,但从未被释放?(我调用2次Create并且只有1次Free)是按照函数提供对象的内存安全吗?还是我应该使用过程来执行此任务,其中只是处理对象创建和销毁(过程ProvideStringlist)?我叫2次创建和2次免费.还是有其他解决方案吗?
Thanx提前
Lyborko
假设我有一个功能:
function someFunction: TStringList;
begin
result:=TStringList.Create;
if someConditionIsTrue then
result:=doSomething;
//other code
end;
Run Code Online (Sandbox Code Playgroud)
功能doSomething:
function doSomething: TStringList;
begin
result:=TStringList.Create;
result.Add(something);
end;
Run Code Online (Sandbox Code Playgroud)
如果我运行这个代码,一切都按预期工作,但我仍然想知道这是否是传递像stringlist这样的对象的"正确"方法?
字符串列表永远不会被释放,我想知道在调试或其他人试图理解代码时,以这种方式传递对象会变得复杂或混乱.