作为函数返回值的tstringlist临时变量如何释放?(50分)

  • 主题发起人 主题发起人 qdlover
  • 开始时间 开始时间
Q

qdlover

Unregistered / Unconfirmed
GUEST, unregistred user!
例如
function test:tstringlist;
var
temp:tstringlist;
begin
temp:=tstringlist.creat;
result:=temp
temp.free;//如果在这里释放了,那么就在调用的时候报错了,不释放程序就没问题
end;

调用的部分
var
t2:tstring;
t2:=test;//调用函数
richedit1.Lines :=t2;


这个样子不释放行吗?或者应该用什么方法来释放?
 
procedure test(var Data:Pointer)
begin
//对data所指向的地址进行操作
end;

调用的部分
t2:=tstringlist.create ;
t2:=test(@t2);//调用函数
t2.free
你试一下可以不,我也不清楚
 
procedure test(var ss :TstringList);
不如用引用,在主程序中初始化TSTRINGLIST;
 
procedure test(sl:tstringlist);
begin
if sl=nil then Exit;
sl.add('hello,这样搞比较好,外部程序自己申请资源,自己释放,跟函数内部无关');
end;

调用部分
var
temp:tstringlist;
begin
temp:=tstringlist.creat;
test(temp);
showmessage(temp.text);
temp.free;
 
不明白,为什么楼上的都要用procedure而不用function来返回值

之所以要写成函数,是为了复用,在里面直接写定控件赋值显然是不合适的
 
调用和释放的原则一般是"谁调用,谁释放"
 
个人认为,最好是将要写入内容的Strings传给函数。
procedure test(strs: TStrings);
begin
strs.Add(...);
...
end;

调用时,
tmp = TStringList.Create;
test(tmp);
tmp.Free;

也就是,对象的创建和释放在同一个函数,以避免内存泄漏。
你的方式,如果使用中没有遇到问题,也可以,不过记着释放。
(可以在使用完后就释放)
 
有必要释放么?他们传递是地址,有不是拷贝.而且象这样返回列表函数一般都是在类里面使用,都会声明一个公共的私有变量,跟着类一起创建释放,单独的使用一个函数的情况不多把.
我说的不一定对,自己的看法而已.
 
为什么别人都用过程,你也不好好考虑考虑?

用函数不是不可以使用,只是不符合代码设计的耦合性要求,别人调用也许会忽略释放。
如果你非要用函数来返回一个类,建议再编写一个类,来管理这些返回的类。最终能够确保
由管理类来全部释放。 

否则按你的声明。 外部调用一下,就得赶快记着释放掉,稍有异常或疏忽,资源就泄漏了。
 
就是应该在函数返回后,不再使用tstringlist的值时,free掉即可(不是在函数内释放)

这个问题我曾经详细检查过,当时我的程序内存泄露非常严重
后来跟踪以后,发现就是这个问题
 
函数返回TStringList是可以的,类似下面的用法
function test:tstringlist;
var
temp:tstringlist;
begin
result:=TStringList.Create;
temp:=tstringlist.create;
result.assign(temp); //result:=temp
temp.free;
end;
 
大家好像对函数返回对象有偏见啊,返回TStringList就是返回一个对象而已,
 
函数中不要写释放。调用结束时才释放。
 
谁调用谁释放
 
我认为可以把test函数看成是对象的创建函数(Create).
谁创建谁释放 ^_^
 
function test:tstringlist;
begin
result:=tstringlist.creat;
end;
调用:
var
sl:tstringlist;
begin
sl:=test;
...
sl.free;
end;
 
to flamboyant,

方法可行

是不是result就可以不用free了
程序调用完毕自动释放了?
 
用函数创建对象并返回没有不妥的地方,类工厂模型就是一个典型。
关键是如何保证创建的对象一定会被释放。
楼主创建的对象是要局部使用还是要在全局使用
如果是局部使用,那么楼上很多富翁的回答都是正确的思路,应该在一个可控的环境中用
slTemp:=TStringList.create;
try
.....
finally
slTemp.free;
end;
这样的句型处理
如果是创建后在整个进程中随时使用,可以用一个List或者TCollection管理起来至少在Collection释放的时候可以释放这些对象
 
to qdlover,
result也是需要释放的,但不再函数内部释放。如下:
sl1:Tstringlist;
sl1=test();
{
code here
}
freeandnil(sl1);
 
flamboyant的方法和_Murray的方法本质上是一样的,都是通过传送地址来完成的,只不过变了一下形式
 
后退
顶部