函数返回Tstringlist类型的结果,如何释放它(50分)

  • 主题发起人 主题发起人 mycwcgr_bak
  • 开始时间 开始时间
M

mycwcgr_bak

Unregistered / Unconfirmed
GUEST, unregistred user!
我们知道Tstringlist类型的变量,在使用完成后要用Free释放它
下面这个函数 fuction cw:tstringlist
只有 Result:=Tstringlist.create;语句,而无法使用Free语句,请问是不是不需要
人工写,或者是程序在self.ListBox1.items.Assign(cw);语句后自动释放cw

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
Function cw:tStringlist;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
{ TForm1 }
function TForm1.cw: tStringlist;
begin
Result:=Tstringlist.create;
Result.Add('Item1');
Result.Add('Item2');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
self.ListBox1.items.Assign(cw);
end;

end.
 
不用释放啦,变量超过作用域自动释放了
var
sl:tstringlist;
begin
sl:=cw;
self.ListBox1.items.Assign(sl);
sl.free;//写不写都无所谓,因为是局部变量,会自动释放
end;

 
我是不敢这么用,这么好嘛,我没测试过。
 
自行建立的对象要自己释放!
 
要养成好的习惯,有create,最好有free
 
当然要释放,如果是简单类型的变量,是会自动释放的(Delphi也没有提供简单类型数据的释放函数),
但是如果是类或者指针,就必须显式的释放,但是如果是从TComponent上继承下来的类,它的Owner会
负责释放属于这个Owner的所有Child,象TStringList这样的对象是需要手工释放的.
你可以改变一下:
function TForm1.cw: tStringlist;
begin
Result:=Tstringlist.create;
Result.Add('Item1');
Result.Add('Item2');
end;

procedure TForm1.Button1Click(Sender: TObject);
Var St:TStringList;
begin
st:=cw;
self.ListBox1.items.Assign(st);
st.Free;
end;

或者改变cw函数:
Procedure TForm1.cw(Var sw:tStringlist);
begin
sw.Add('Item1');
sw.Add('Item2');
end;

procedure TForm1.Button1Click(Sender: TObject);
Var St:TStringList;
begin
st:=TStringList.Create;
cw(st);
self.ListBox1.items.Assign(st);
st.Free;
end;
 
或者再简单点:
Procedure TForm1.cw(sw:tStringlist);
//Procedure TForm1.cw(Var sw:tStringlist);
//如果你明白传递指针变量和传递普通变量的区别就明白这里可以不用var标识了.
//这里不能用Var标识因为下面传入self.ListBox1.items不是变量是属性.
begin
sw.Add('Item1');
sw.Add('Item2');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
cw(self.ListBox1.items);
end;
 
to ysai:
看来你是不了解Delphi的对象模式,
每一个创建的对象都需要释放,
如果不释放,则会产生内存泄漏,
你的程序占用的内存会越来越大,除非重新启动程序
 
不知道系统会不会自动释放。
 
所谓ysai是指变量本身所占用的内存,而变量本身所占的内存对于指针类型或者类类型
变量来说,都是4个字节,我们一般来说自动释放变量,对于简单类型的变量,释放变量本身
占用的内存,就是释放完成了,但是对于指针或类来说,变量本身所占的内存不是主要的,
而是变量作为指针(类变量其实也是一个指针变量),所指向的内存,比如某个TButton类型
的变量Button1,这个变量所占用的内存地址是1000,占用4个四字节(从1000到1003),这
四个字节就会保存Button1实例所占用的内存的起始地址,比如是3500,那么从内存3500开始
就保存着Button1的所有成员,方法句柄等,这段内存可能远远不止4个字节,所以我们释放一
个指针类型的变量的时候,主要是释放这个变量所指向的内存,而不是变量本身所占用的内存,
变量本身所占用的内存是由程序自动释放,对于指针类型的变量所指向的内存可以用Dispose
来释放,而对于类变量所占用的内存则必须用Free方法来释放.
 
同意,精彩
 
不要返回这样的值!
学习一下API函数,传递指针,返回值都是判断函数执行是否错误的简单类型。
aizb的方法才是标准的写法,嘻嘻
 
TStringlist应该释放的,使用FREE方法
 
我果然错了,对象变量和简单类型变量不同,是要释放的
在此向大家道歉!!!
 
没有什么标准的写法,所谓的标准都是人定的。
ysai的写法也可以,只是注释应该略去。
 
Result 会自动释放!
 
result 没有释放,不然,通过赋值是得不到任何值的。
 
接受答案了.
 

Similar threads

I
回复
0
查看
740
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部