TStrings 参数传递方法

          正常情况下,我们都是习惯于直接把结果当作函数的结果返回
例如:
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;
—————————————————————————————————–
如此进行,基本上不用考虑对象是深拷贝,浅拷贝的问题
只需进行常规的操作,避免了内存的创建,释放的困扰。
——————————————————————————————————

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据