某一自定义函数返回值的类型为TStringList;如下:
function FuncName(const VariantName:integer):TStringList;
var
RValue:TStringList;
begin
RValue:=Tstringlist.create;
...
Result:=RValue; //现在不使用这个RValue了,该如何释放掉这个?free肯定错误的!
//或者是否有一种好的解决办法?
end;
function FuncName(const VariantName:integer):TStringList;
var
RValue:TStringList;
begin
RValue:=Tstringlist.create;
...
Result:=RValue; //现在不使用这个RValue了,该如何释放掉这个?free肯定错误的!
//或者是否有一种好的解决办法?
end;
解决方案 »
- dbgrideh汇总行问题
- 请问,用Delphi如何写程序将Excel或txt导入oracle?
- 请问一个简单问题,datasource属性设置
- 救命呀!!!!!请教高手,如何在DBGRID中对某一Column进行重画,其内容包括用不同颜色表示的分隔线?
- Interbase的连接问题?
- 散分兼问题
- 如何接收发往Tapplication的消息?注意,我写的是Service,不能用application.onmessage=XXX模块的方式,因为Service中根本没有此属性
- 我要大量的Delphi编的软件的源程序,学习用,相送者给高分。
- 怎样判断一个form是否已create或show,(不另加变量如done:=true)
- COM+的事务问题,分数不够再加哦!!!!!高手去哪了????
- 如何实现动态参数的传输?
- 输入word文档viso文档和excel文档。要求输出的结果是pdf文档,如何实现?
function FMY(SLMY :TstringList):boolean;
局部变量如integer变量等是会自动释放,但TStringList就不一样了!
参数应该使用var的吧,不然还是出事!!
感觉好象不要VAR也可以,应该就是按地址传递参数啊。当然保险起见还是加上
对象=指针
函数返回后,可以利用返回值来访问堆中的TStringList对象,使用完以后再调用Free即可释放堆中的TStringList对象了。
另外,如果你想在函数体中释放RValue变量所占内存是不可能的,因为你不可能手工释放栈的内存。
我也没试过,你试试:)
XXX(lst);
//do...
lst.Free();
问一下,函数参数是属于局部变量还是全局?
你也在函数体内Free掉了TStringlist变量。
这样子我外部怎么使用它?
在外部调用的时候创建一个TStringList型变量,
外部调用完后再Free掉那个变量!!
listString:TStringList; list:=FuncName(0); //使用list list.Free;
list:=nil;
function XXX(lst:TStringList):Boolean;
begin
//add some string to StringList.
end; 调用时: lst:=TStringList.Create();//Create先
XXX(lst);
//do...
lst.Free();
应该用:
function FuncName(const VariantName:integer):TStringList;
begin
result:=Tstringlist.create;
end;返回的是指针,内存没有问题的
delphi中所有class的实例俱为指针,
无需为此操心。
明白了!!呵呵!!befree(似有似无):
假设我们对Result进行了操作,如Add(String)等,那么就跟内存没有关系?
如果你赋植给另一个变量,占用的内存是你的调用变量
如:function FuncName:TStringList;
begin
result:=Tstringlist.create; //只是一个指针
result.add('love someone'); //加了
end;procedure one;
var needstrings:TStringList;
begin
{ needstrings:=TStringList.create; //另一个指针 ,多余}
needstrings:=TStringList;
showmessage(needstrings[0]);
needstrings.free; //释放了
end;