• 主页
  • 招聘
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API

combobox中的内存释放问题

szkingrose 2005-10-25 10:23:43
我在一个很简单的程序中使用了AddObject
但内存释放出错,请各位帮我看看,谢谢!

procedure TForm1.Button1Click(Sender: TObject);
var i:integer ;
P:PString;
begin
for i:=0 to 1000 do
begin
New(P);
P^:=IntToStr(i);
ComboBox1.Items.AddObject(IntToStr(i),TObject(p));
end ;
ShowMessage('ok');
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:Integer ;
begin
for i:=ComboBox1.Items.Count -1 downto 0 do
begin
if combobox1.Items.Objects[i]<>nil then
ComboBox1.Items.Objects[i].Free ; //这句出错,便获取的Ojbect值是没有错误的.
end ;
ShowMessage('ok');
end;

谢谢!
...全文
132 点赞 收藏 10
写回复
10 条回复
szkingrose 2005年10月27日
回: dd_zhouqian

还有 ComboBox1.Items.Objects[i]:=nil;
那Object原来占有的内存去哪里了?

   难道会因为ComboBox1.Items.Objects[i]:=nil; 就释放了吗?

非常感谢!
回复 点赞
szkingrose 2005年10月27日
回: dd_zhouqian

很高兴看到你的再次回复.

combobox.items我并不需要删除.因为

Addobject是在Form.create中建立的.

Form.close时会Delphi自动清除combobox的items,但不会自动清除Ojbect

所以我需要做的工作就是在Form.Close时清除AddOjbect时产生的Object(没有删除combobox.Items)

你的改写的过程我看了,我感觉有疑问:

ComboBox1.Items.Objects[i]:=nil;
ComboBox1.Items.Objects[i].Free;

如果Object:=nil那么object还有Free的必要吗?

谢谢!



回复 点赞
szkingrose 2005年10月25日
楼上的,不行.

还是一样的错误.
回复 点赞
sxy_9761 2005年10月25日
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer ;
begin
for i:=0 to 1000 do
ComboBox1.Items.AddObject(IntToStr(i),Pointer(i));
ShowMessage('ok');
end;
回复 点赞
dd_zhouqian 2005年10月25日
to konhon(优华),button1click->button2click->button2click->报错拉
to szkingrose(szkingrose) 内存的释放是什么?不知道你在问这个问题的时候自己有没有搞清楚,到低释放后的结果是什么?
如果要释放的话,那么连p都要释放!
我只是路过顺便发个贴的
回复 点赞
szkingrose 2005年10月25日
谢谢各位!

konhon(优华) 你的答案应该是对的.

回复 点赞
konhon 2005年10月25日
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer ;
begin
for i:=ComboBox1.Items.Count -1 downto 0 do
begin
if combobox1.Items.Objects[i]<>nil then
Dispose(PString(ComboBox1.Items.Objects[i])); //这句出错,便获取的Ojbect值是没有错误的.
end ;
ShowMessage('ok');
end;
回复 点赞
szkingrose 2005年10月25日
dd_zhouqian

你的程序执行是没有问题,但是我有点怀疑内存并没有被释放.

ComboBox1.Items.Objects[i]:=nil;
ComboBox1.Items.Objects[i].Free;//修改


能解释一下吗?谢谢!
回复 点赞
dd_zhouqian 2005年10月25日
不好意思应该改成这样:
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer ;
begin
for i:=ComboBox1.Items.Count -1 downto 0 do
begin
if combobox1.Items.Objects[i]<>nil then
//ComboBox1.Items.Objects[i].Free ; //这句出错,便获取的Ojbect值是没有错误的.
begin
ComboBox1.Items.Objects[i]:=nil;
ComboBox1.Items.Objects[i].Free;//修改
end;
end;
ShowMessage('ok');
end;
回复 点赞
dd_zhouqian 2005年10月25日
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer ;
begin
for i:=ComboBox1.Items.Count -1 downto 0 do
begin
if combobox1.Items.Objects[i]<>nil then
//ComboBox1.Items.Objects[i].Free ; //这句出错,便获取的Ojbect值是没有错误的.
FreeAndNil(ComboBox1.Items.Objects[i]);//修改
end ;
ShowMessage('ok');
end;
回复 点赞
发动态
发帖子
Delphi
创建于2007-08-02

1474

社区成员

26.2w+

社区内容

Delphi 开发及应用
社区公告
暂无公告