通常函数要返回 TStrings 的话,都是以 var a: TStrings 的形式返回,如:
function f(var a: TStrings): Boolean;
调用前,先 Create 一下。请问下面的写法有没有什么问题?函数调用完后 Result 对应内存就被释放了吗?不甚明白,请大虾们指点!
procedure TForm1.Button1Click(Sender: TObject);
function a(): TStrings;
begin
Result := TStringList.Create();
Result.Add('a');
end;
begin
ShowMessage(a()[0]);
end;
function f(var a: TStrings): Boolean;
调用前,先 Create 一下。请问下面的写法有没有什么问题?函数调用完后 Result 对应内存就被释放了吗?不甚明白,请大虾们指点!
procedure TForm1.Button1Click(Sender: TObject);
function a(): TStrings;
begin
Result := TStringList.Create();
Result.Add('a');
end;
begin
ShowMessage(a()[0]);
end;
解决方案 »
- OLE访问Excel,提示错误“Variant does reference to an automation object”
- 模板放到动态库里,EXE执行文件进行继承开发系统
- 求教启动画面中启动状态的显示(如3DMAX等)
- 如何彻底释放List的空间
- 怎样让dbedit具有maskedit的属性?
- TpageControl控件,有4个Ttabsheet,如何让其中几个不显示,visible属性好像不管用
- ADO出错~HELP!!!!!!!!!!!!
- 怎样连接access数据库
- 如何用Delphi实现类似于delphi的Object Inspector那样的小窗体?
- 关于readfile(...)的问题
- 如何查询在一个报表中日期在用户选定日期之内的记录
- 这个问题把头都快想爆了,高手来帮帮啊~
一般情况下使用下面的方式操作StringList
a: = TStringList.Create;
try
Test(a);
..... //这里可以操作a对象.
finally
a.free;
end;其中Test函数可以是这样的
procedure Test(const strlist: TStringList);
begin
strList.add('a');
end;
那这样该释放了吧?
procedure TForm1.Button1Click(Sender: TObject);
function a(): TStrings;
begin
Result := TStringList.Create();
Result.Add('a');
end;
begin
with a() do
begin
ShowMessage(Strings[0]);
Free;
end;
end;
然而还有一种情况就是分配的堆内存,这种情况在函数退出的时候是不会释放的,需要自己来释放(我这里讲的函数和过程是指你自己定义的,vcl中除外)。也就是说你退出函数的时候申请的那块东西照样存在。这里主要包括new() 对象(create)。
function a(): TStrings;
begin
Result := TStringList.Create();
Result.Add('a');
end;
begin
ShowMessage(a()[0]);
end;
对于上面一段代码,在执行函数a()之后还没有立即释放,然后执行完Button1的click事件后应当释放了吧?
要执行free后才会释放地。
退出click后,释放的仅仅是在栈上的StringList的引用