Owner是一个对象的拥有者,负责该对象的释放。当Owner释放时,被它拥有的所有对象将都被释放
Parent是一个控件的“父”,即该控件的容器,它决定该控件在哪里显示

解决方案 »

  1.   

    如果Panel2已经释放掉,指针为nil了,那么
    b:=TButton.Create(panel2);
    就相当与
    b:=TButton.Create(nil);
    所以此时点Button2不能释放b
      

  2.   

    我试着又Free了Panel1,这样即使Panel2还在,也不能看到创建的Button了,
    而我想知道的是,在Create、Owner和Parent的背后,Delphi是如何安排它们
    的生存期,并且是如何管理它们的内存的?如果太复杂,能推荐这方面的书给我
    自己看吗?
      

  3.   

    你free Panel1后将造成内存泄漏,b在内存中没有被释放成了垃圾,正如 dancemaple(枫之舞) 所说,点击Button2释放了Panel2以后,在点击Button1,就相当与b:=TButton.Create(nil);此时b能显示,因为他有Parent Panel1,然而Panel1被free并不会free b。
    所以说,如果b有Owner(拥有者)时你不必负责它的删除,Owner被析构时,他负责释放他拥有的组件。
    而父组件负责调用子组件的方法来绘出子组件,父组件和拥有者可以是不同的。
      

  4.   

    那么,释放掉Panel2后创建b是不是已经造成了内存泄漏呢?
      

  5.   

    对阿,我也想问,如果TButton.Create(nil),那么这个按钮由谁来释放呢?由系统来管理吗?
      

  6.   

    如果TButton.Create(nil),那么这个按钮只能由你来释放,系统不会管理的。
    看看delphi5开发人员指南582页。
      

  7.   

    procedure TForm1.Button1Click(Sender: TObject);
    var b:Tbutton;
    begin
      b:=TButton.Create(nil);
      b.Parent:=panel1;
    end;是啊这样b所指的一块内存在该过程结束后,就成了没人管的了
    记得看书说,当程序结束后,操作系统会回收应用程序所占用的内存
    但在执行期间将一直占用