+ -
当前位置:首页 → 问答吧 → 关于对象释放问题,请帮忙看看

关于对象释放问题,请帮忙看看

时间:2011-09-08

来源:互联网

Delphi(Pascal) code

procedure TForm1.Button1Click(Sender: TObject);
var
  s:TStrings;
  test:TTest;
begin
  //test add object
  s:=TStringList.Create;
  test:=TTest.Create;
  test.str:='test1';
  test.id:=1;
  s.AddObject(test.str,test);
  test.Free;
  test:=TTest.Create;
  test.str:='test2';
  test.id:=2;
  s.AddObject(test.str,test);
  test.Free;
  CheckListBox1.Items:=s;
  s.Free;
end;


该代码运行似乎没问题,可是我有一点疑问,s赋值给items后还需要手工释放吗?delphi组件不是会自动释放吗?还有最后那句s.free,我以为执行完这句对象被释放,应该什么都不显示,可是事实上显示正常。

作者: westuser   发布时间: 2011-09-08

CheckListBox1.Items:=s;是将s中的内容拷贝到CheckListBox1.Items中,它们是2个不同的对象,因此,对s的操作不会影响到CheckListBox1.Items,反之道理一样。

作者: xinghun61   发布时间: 2011-09-08

为了开发者方便,Vcl里面有些属性使用起来是有歧义的,比如你写的
CheckListBox1.Items:=s;
咋看起来还以为是赋值一个引用,实际上调用的是Items属性的setter,里面类似于:
procedure TXXX.SetItems(value: TStrings);
begin
  fItems.Assign(value);
end;
这个可以理解为字符串列表的Clone。建议你好好看看里面的代码,把思路整理整理:)

作者: ZuoBaoquan   发布时间: 2011-09-08

指针、地址、内存
指针P存放的只是一段内存的地址
P.FREE
是释放P中存放地址指向的内存,P中还是有存放地址的,不过该地址指向的内存空间已经释放。

作者: rainychan2009   发布时间: 2011-09-08

热门下载

更多