我在函数中声名一个局部变量。类型为类类型。代码如下:
procedure tform1.foo;
var
  f:tlabel;
  i:integer;
begin
  for i:=0 to 10 do
  begin
    f:=tlabel.create(form1);
    f.parent:=form1;
    f.caption:=inttostr(i);
  end;
end;现在请问。过程返回后。f能否自动释放?
欢迎讨论

解决方案 »

  1.   

    能,你指定了拥有者 form1
    在form1被释放的时候,会便利她的拥有的控件,并且释放
      

  2.   

    如果f的parent 不是form1而是panel或者别的可以作为parent的控件呢?
      

  3.   

    同样可以,只要指定了控件的Parent,那么在Panel被释放的时候会遍历其全部子控件并释放但你的程序中创建了11个TLabel对象,而对象指针F却指向最后一个,幸好你创建的时候指定了Parent,否则就要内存泄露了,万一在控制不好,进入死循环,那么最后会堆溢出!
      

  4.   

    哦,我看错了,你申明的是局部变量!!!!!!!!!我还没有实验过局部类对象不指定Parent在过程返回后是否会自动释放,个人认为应该不指明Parent也可以释放,你用FindComponent查找看看能否找到!
      

  5.   

    我在胡说什么,呵呵!太马虎了,指定Owner就可以保证Owner在释放时释放气Own的所有东西!!!!
      

  6.   

    tlabel.create(form1); 这句话指定了label的容器是form1.只有当form1销毁的时候,form1容器中的所有组件全部销毁,所以这些label也会被销毁. 即使parent=nil也会销毁.
      

  7.   

    同意findcsdn(searchcsdn)意见。当你没指定好Owner时,内存就要泄漏了。
      

  8.   

    假如不指定owner.只指定parent.组件能销毁吗?
      

  9.   

    同志们,局部变量有意义吗?
      出了这个函数,就什么也没有了,也显示不出来,论不到owner来释放!!
      

  10.   

    vi6: 局部变量出了函数是没有用,但是在函数中创建的对象是全局的,不会因为退出函数而销毁掉。而那个对象变量只不过是指向对象的指针而以。至于不指定owner而指定parent也是有效果的,事实上,随着parent的变更,label的容器对象也会跟着发生变化,比如原来是form1后来改称panel1了,那么它的容器就是panel1了。