Y
ysai
Unregistered / Unconfirmed
GUEST, unregistred user!
//下面的程序只是个演示
//我写的类似的函数还有返回DataSet等对象的
//程序很简单,但可能问题没有好的答案
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Forms, Controls, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
lst: TListBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//一个函数,返回有1000个字符串的字符串列表
function GetList:TStrings;
var
i:Integer;
begin
Result:=TStringList.Create;
for i:=1 to 1000 do
Result.Add(IntToStr(i));
end;
//第一种方法,过程1
procedure TForm1.Button1Click(Sender: TObject);
var
lt:TStrings;
begin
lst.Clear;
lt:=Getlist;
lst.Items.AddStrings(lt);
lt.Free;
//内存正常释放,标准的写法
end;
//第二种方法,过程2
procedure TForm1.Button2Click(Sender: TObject);
begin
lst.Clear;
lst.Items.AddStrings(GetList);
//偷懒的方法,但内存没有被释放,可以在任务管理器中看出
end;
//第三种方法,过程3
procedure TForm1.Button3Click(Sender: TObject);
var
lt:TStrings;
begin
lst.Clear;
lt:=Getlist;
lst.Items.AddStrings(lt);
//这里没有lt.Free
lst.Clear;
lt:=Getlist;
lst.Items.AddStrings(lt);
lt.Free;
//很容易出现的错误,虽然最后释放了lt
//但它第一次引用的对象丢失了,没有被释放
//内存像第二种一样增加
end;
//再试一个例子
//下面的过程多次调用也会增加使用内存
//过程4
procedure TForm1.Button4Click(Sender: TObject);
var
fm:TForm;
lst:TListBox;
begin
fm:=TForm.Create(self);
lst:=TListBox.Create(fm);
lst.Parent:=fm;
lst.Align:=alClient;
//直接用:=,没有用AddStrings
lst.Items:=GetList;
fm.ShowModal;
fm.Free;
end;
//而改成这样就不会了
//过程5
procedure TForm1.Button5Click(Sender: TObject);
var
fm:TForm;
lst:TListBox;
ls:TStrings;
begin
fm:=TForm.Create(self);
lst:=TListBox.Create(fm);
lst.Parent:=fm;
lst.Align:=alClient;
ls:=GetList;
lst.Items.AddStrings(ls);
ls.Free;
fm.ShowModal;
fm.Free;
end;
end.
//问题1过程1,2,3)
//有没有其它方法,可以让第二种方法(过程2)释放内存
//也就是说:
//不声明一个变量而直接使用函数返回的对象,要求对象自释放
//问题2过程4,5)
//照理说fm.Free也释放了lst,当然lst.Items也释放了,
//lst.Items指向的对象,也就是GetList函数取得的Strings也释放了,但......
//过程4造成内存增加,而5没有
//难道lst.Items:=GetList;也会造成对象丢失吗?(不好怎么称呼这种现象)
//是不是lst.Items原来指向的对象没有释放而且没有了管理者???
//如果是的,直接用lst.Items.Free是会出错的,那么这种情况怎么避免?
//我写的类似的函数还有返回DataSet等对象的
//程序很简单,但可能问题没有好的答案
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Forms, Controls, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
lst: TListBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//一个函数,返回有1000个字符串的字符串列表
function GetList:TStrings;
var
i:Integer;
begin
Result:=TStringList.Create;
for i:=1 to 1000 do
Result.Add(IntToStr(i));
end;
//第一种方法,过程1
procedure TForm1.Button1Click(Sender: TObject);
var
lt:TStrings;
begin
lst.Clear;
lt:=Getlist;
lst.Items.AddStrings(lt);
lt.Free;
//内存正常释放,标准的写法
end;
//第二种方法,过程2
procedure TForm1.Button2Click(Sender: TObject);
begin
lst.Clear;
lst.Items.AddStrings(GetList);
//偷懒的方法,但内存没有被释放,可以在任务管理器中看出
end;
//第三种方法,过程3
procedure TForm1.Button3Click(Sender: TObject);
var
lt:TStrings;
begin
lst.Clear;
lt:=Getlist;
lst.Items.AddStrings(lt);
//这里没有lt.Free
lst.Clear;
lt:=Getlist;
lst.Items.AddStrings(lt);
lt.Free;
//很容易出现的错误,虽然最后释放了lt
//但它第一次引用的对象丢失了,没有被释放
//内存像第二种一样增加
end;
//再试一个例子
//下面的过程多次调用也会增加使用内存
//过程4
procedure TForm1.Button4Click(Sender: TObject);
var
fm:TForm;
lst:TListBox;
begin
fm:=TForm.Create(self);
lst:=TListBox.Create(fm);
lst.Parent:=fm;
lst.Align:=alClient;
//直接用:=,没有用AddStrings
lst.Items:=GetList;
fm.ShowModal;
fm.Free;
end;
//而改成这样就不会了
//过程5
procedure TForm1.Button5Click(Sender: TObject);
var
fm:TForm;
lst:TListBox;
ls:TStrings;
begin
fm:=TForm.Create(self);
lst:=TListBox.Create(fm);
lst.Parent:=fm;
lst.Align:=alClient;
ls:=GetList;
lst.Items.AddStrings(ls);
ls.Free;
fm.ShowModal;
fm.Free;
end;
end.
//问题1过程1,2,3)
//有没有其它方法,可以让第二种方法(过程2)释放内存
//也就是说:
//不声明一个变量而直接使用函数返回的对象,要求对象自释放
//问题2过程4,5)
//照理说fm.Free也释放了lst,当然lst.Items也释放了,
//lst.Items指向的对象,也就是GetList函数取得的Strings也释放了,但......
//过程4造成内存增加,而5没有
//难道lst.Items:=GetList;也会造成对象丢失吗?(不好怎么称呼这种现象)
//是不是lst.Items原来指向的对象没有释放而且没有了管理者???
//如果是的,直接用lst.Items.Free是会出错的,那么这种情况怎么避免?