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;

谢谢!
...全文
228 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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;

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧