TStrings不能释放(100分)

  • 主题发起人 主题发起人 SINGLBOY
  • 开始时间 开始时间
S

SINGLBOY

Unregistered / Unconfirmed
GUEST, unregistred user!
代码:
function ReturnSs:TStrings;
var GSs:TStrings;
begin
 ; GSs := TStringList.Create;
 ; try
 ;  ; GSs.Add('aaaaaaaaaa');
 ;  ; Result:=GSs;
 ; finally
//  ;  ;GSs.Free;  ;  ;  ;  ;  ;//打开这句话后程序出错
 ; end;

end;


procedure TForm1.Button1Click(Sender: TObject);
var
 ; MSs:TStrings;
begin
 ; MSs := TStringList.Create;
 ; try
 ;  ; MSs:=ReturnSs;
 ;  ; ShowMessage(MSs[0]);
 ; finally
 ;  ; MSs.Free;
end;
 
当然会出错了.
在TForm1.Button1Click(Sender: TObject)中你还要用这个strings,但是在
function ReturnSs中你已经释放了.

procedure ReturnSs(Gss :TStrings);
begin
; GSs.Add('aaaaaaaaaa');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
; MSs:TStrings;
begin
; MSs := TStringList.Create;
; try
; ; ReturnSs(MSs);
; ; ShowMessage(MSs[0]);
; finally
; ; MSs.Free;
; end;
end;
 
这是因为你在Button1Click时,调用了函数ReturnSs,而这时你在ReturnSs里释放TStrings,
就不能在Button1Click里进行MSs:=ReturnSs了。
 
同意楼上的
 
我还是不太明白?
在GSs.Free 之前我以竟 将Result:=GSs 它传的是值还是地址?
如果GSs不释放的话,它会自动释放吗?
 
Result:=GSs 是传址
 
function ReturnSs:TStrings;
var GSs:TStrings;
begin
; GSs := TStringList.Create;
; try
; ; GSs.Add('aaaaaaaaaa');
; ; Result:=GSs;[red]//此句只是给Result一个对GSs的引用。Result实际上就是GSs[/red]
; finally
// ; ;GSs.Free; ; ; ; ; ;//打开这句话后程序出错
; ;[red]//此句把GSs释放了,同时也就是说Result引用了一个未确定的对象[/red]
; end;

end;


procedure TForm1.Button1Click(Sender: TObject);
var
; MSs:TStrings;
begin
; MSs := TStringList.Create;
; try
; ; MSs:=ReturnSs; ; ; ; ; ; ; ; ; ; ; ;
; ; [red]//引用了返回的未确定的对象,并丢失了对新创建对象的引用[/red]
; ; ShowMessage(MSs[0]);
; finally
; ; MSs.Free;[red]//释放一个未确定的对象,并无法释放新创建的对象[/red]
end;
建议作如下改动:
function ReturnSs:TStrings;
begin
; Result := TStringList.Create;
; Result.Add('aaaaaaaaaa');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
; MSs: TStrings;
begin
; MSs := ReturnSs;
; try
; ; ShowMessage(MSs[0]);
; finally
; ; MSs.Free;
; end;
end;
 
楼上说的很清楚
 
在返回前你把它free掉了!
 
>>JohnsonGuo
我想深了解这方面的东西应该看什么书?
 
介绍看一本说《Delphi5开发人员指南》
 
后退
顶部