正常情况下,我们都是习惯于直接把结果当作函数的结果返回
例如:
1)
function getCommList:TStrings;
var
sl:TStrings;
begin
sl:=TStringList.create;
…..
result:=sl;
end;
____________________________
然后调用:
var
sl2:TStrings;
begin
sl2:=TStringList.create; //这里也需要,不然会警告没有初始化
try
sl2:=getCommList;
…
finally
sl2.free;
end;
end;
————————————————————————-
这样,就有问题了,创建了两次的TStringList,却只进行了一次释放
——————————————————————————————
2)
function getCommList:TStrings;
var
sl:TStrings;
begin
sl:=TStringList.create;
try
…..
result.assign(sl);
finally
sl.free;
end;
end;
____________________________
然后调用:
var
sl2:TStrings;
begin
sl2:=TStringList.create;
try
sl2:=getCommList;
…
finally
sl2.free;
end;
end;
———————————————————————————
如此,进行了两次分配,两次释放,但是,运行的时候,却报AV错误
原因不清
或许是sl已经释放,assign并未真正的拷贝了数据?
————————————————————————————————
3)推荐的方法
procedure getCommList(var sl:TStrings );
begin
//只需进行必要的赋值
sl.clear;
sl.items…….
end;
____________________________
然后调用:
var
sl2:TStrings;
begin
sl2:=TStringList.create; //这里安正常的需要创建
try
getCommList(sl2);
…
finally
sl2.free;
end;
end;
—————————————————————————————————–
如此进行,基本上不用考虑对象是深拷贝,浅拷贝的问题
只需进行常规的操作,避免了内存的创建,释放的困扰。
——————————————————————————————————