TStrings 参数传递方法
正常情况下,我们都是习惯于直接把结果当作函数的结果返回
例如:
1)
functiongetCommList: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)
functiongetCommList: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(varsl:TStrings );
begin
//只需进行必要的赋值
sl.clear;
sl.items.......
end;
____________________________
然后调用:
var
sl2:TStrings;
begin
sl2:=TStringList.create; //这里安正常的需要创建
try
getCommList(sl2);
...
finally
sl2.free;
end;
end;
-----------------------------------------------------------------------------------------------------
如此进行,基本上不用考虑对象是深拷贝,浅拷贝的问题
只需进行常规的操作,避免了内存的创建,释放的困扰。
——————————————————————————————————
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。