Y
yugen
Unregistered / Unconfirmed
GUEST, unregistred user!
虽然从语法上说,类类型作为函数的返回值是可以的,但这会引起许多问题。
因为类是静态装入内存中的,当创建一个对象时,将把类的属性复制1份到内存中并初始化,新的对象指
向这片区域,对象的格式为类地址(4字节)+对象属性,所以所有对象共享方法而拥有不同的属性,也可
以在运行时确定对象的类型信息。
正因为对象实际上是指针,所以下面程序执行后
function list():Tstringlist;
var
;s:tstringlist;
begin
; s:=tstringlist.Create;
; s.Add('s1');
; s.Add('s2');
; result:=s;
; s.free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
; listbox1.Items:=list;
end;
result和S指向同一片内存区域,S虽然正确释放,同时result也不能返回正确结果。
若将s.free语句去掉,虽然可返回正确结果,但是第二次执行button1Click时,
listbox1.Items将指向新的list值,原来的listbox1.items不能释放。 ;
function list():Tstringlist;
var
;s:tstringlist;
begin
; s:=tstringlist.Create;
; s.Add('s1');
; s.Add('s2');
; result:=s;
; s.free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
; i:integer;
begin
; for i:=0 to ;100000 do
; listbox1.Items:=list;
end;
执行以上程序时,虽然不能返回正确结果,但用任务管理器查看,程序大小在2M左右。
将s.free去掉后,程序能返回正确结果,但程序超过10M!!!
因此,小弟认为,不要用类变量作为函数的返回值,可以用过程代替。
因为类是静态装入内存中的,当创建一个对象时,将把类的属性复制1份到内存中并初始化,新的对象指
向这片区域,对象的格式为类地址(4字节)+对象属性,所以所有对象共享方法而拥有不同的属性,也可
以在运行时确定对象的类型信息。
正因为对象实际上是指针,所以下面程序执行后
function list():Tstringlist;
var
;s:tstringlist;
begin
; s:=tstringlist.Create;
; s.Add('s1');
; s.Add('s2');
; result:=s;
; s.free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
; listbox1.Items:=list;
end;
result和S指向同一片内存区域,S虽然正确释放,同时result也不能返回正确结果。
若将s.free语句去掉,虽然可返回正确结果,但是第二次执行button1Click时,
listbox1.Items将指向新的list值,原来的listbox1.items不能释放。 ;
function list():Tstringlist;
var
;s:tstringlist;
begin
; s:=tstringlist.Create;
; s.Add('s1');
; s.Add('s2');
; result:=s;
; s.free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
; i:integer;
begin
; for i:=0 to ;100000 do
; listbox1.Items:=list;
end;
执行以上程序时,虽然不能返回正确结果,但用任务管理器查看,程序大小在2M左右。
将s.free去掉后,程序能返回正确结果,但程序超过10M!!!
因此,小弟认为,不要用类变量作为函数的返回值,可以用过程代替。