ComBoBox中addObject函数的内存释放问题???

zyblotuszyb 2007-04-10 10:49:30
procedure TForm1.Button1Click(Sender: TObject);
var tmp1:string;
tmp2:^string ;
begin
new(tmp2);
tmp1 := '1';
tmp2 ^:= 'abc';
CbBox1.Items.AddObject(tmp1,TObject(tmp2^));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to CbBox1.Items.Count-1 do
if CbBox1.Items.Objects[i]<>nil then
begin
Dispose(pstring(CbBox1.Items.Objects[i]));
end;
end;
上述语句中,一执行到Dispose就出错,怎么回事???
...全文
302 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sotwind 2007-04-11
  • 打赏
  • 举报
回复
vc
zyblotuszyb 2007-04-11
  • 打赏
  • 举报
回复
搞定了!!!
procedure TForm1.Button1Click(Sender: TObject);
var tmp1:string;
tmp2:^string ;
begin
new(tmp2);
tmp1 := '1';
tmp2 ^:= 'abc';
CbBox1.Items.AddObject(tmp1,TObject(tmp2));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to CbBox1.Items.Count-1 do
if CbBox1.Items.Objects[i]<>nil then
begin
Dispose(pstring(CbBox1.Items.Objects[i]));
end;
end;

访问tmp2的值:(pstring(CbBox1.Items.Objects[CbBox1.ItemIndex]))^
散分
zyblotuszyb 2007-04-11
  • 打赏
  • 举报
回复
这里的问题
CbBox1.Items.AddObject(tmp1,TObject(tmp2));
to hongqi162(失踪的月亮):
这样添加的话,那如何访问tmp2的值,用如下的语句无法访问(原来用tmp^可以)
string(CbBox1.Items.Objects[CbBox1.ItemIndex]);

多谢
qiume 2007-04-11
  • 打赏
  • 举报
回复
既然内存泄漏,那么对象指向的东西就成了无本之木......
qiume 2007-04-11
  • 打赏
  • 举报
回复
不要这样用,会造成内存泄漏:
procedure TForm1.Button1Click(Sender: TObject);
var tmp1:string;
tmp2:^string ;
begin
new(tmp2);
tmp1 := '1';
tmp2 ^:= 'abc';
CbBox1.Items.AddObject(tmp1,TObject(tmp2^));

//tmp1为生存期自管理,所以没问题;
//tmp2为指针类型,这时候tmp2失效,而它指向的内存没有释放;
end;
hongqi162 2007-04-11
  • 打赏
  • 举报
回复
这里的问题
CbBox1.Items.AddObject(tmp1,TObject(tmp2));
zyblotuszyb 2007-04-11
  • 打赏
  • 举报
回复
各位高手能不能帮忙给试一下啊,以上说得都不行
hongqi162 2007-04-10
  • 打赏
  • 举报
回复
for i:=CbBox1.Items.Count-1 to 0 do
Dispose(Pointer(CbBox1.Items.Objects[i]));
hongqi162 2007-04-10
  • 打赏
  • 举报
回复
for i:=CbBox1.Items.Count-1 to 0 do
if CbBox1.Items.Objects[i]<>nil then
begin
Dispose(Pointer(CbBox1.Items.Objects[i]));
end;
zyblotuszyb 2007-04-10
  • 打赏
  • 举报
回复
用o.free也是出错,真是怪事
zyblotuszyb 2007-04-10
  • 打赏
  • 举报
回复
procedure TFormYddwxx.Button1Click(Sender: TObject);
var i:integer;
o:Tobject;
begin
for i:=0 to CbBox1.Properties.Items.Count-1 do
begin
o := CbBox1.Properties.Items.Objects[i];
FreeAndNil(o);
end;
end;
FreeAndNil(o);还是出现错误
zyblotuszyb 2007-04-10
  • 打赏
  • 举报
回复
楼上,FreeAndNil(CbBox1.Items.Objects[i])出现错误:“Constant object cannot be passed as var parameter”
chenzhuo 2007-04-10
  • 打赏
  • 举报
回复
for i:=0 to CbBox1.Items.Count-1 do
FreeAndNil(CbBox1.Items.Objects[i]);
zyblotuszyb 2007-04-10
  • 打赏
  • 举报
回复
具体怎么做
withcsharp 2007-04-10
  • 打赏
  • 举报
回复
string ?? 不要吧

你用record 等
chenzhuo 2007-04-10
  • 打赏
  • 举报
回复
CbBox1.Items.AddObject(tmp1,TObject(tmp2^)); ->
CbBox1.Items.AddObject(tmp1,TObject(tmp2));
zyblotuszyb 2007-04-10
  • 打赏
  • 举报
回复
高手帮忙啊
zyblotuszyb 2007-04-10
  • 打赏
  • 举报
回复
hongqi162(失踪的月亮) ,还是不行,显示“invalid pointer operation”

5,388

社区成员

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

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