由用户显示Create的对象是需要的,但Delphi自己创建的就不必要,除非你刻意要释放那个对象

解决方案 »

  1.   

    “由用户显示Create的对象”是不是指用户自己创建的?无论局部、全局的对象都需要,是这个意思吗?
      

  2.   

    如果Create后面的参数为NIL的时候,就一定需要调用Free。
      

  3.   

    能不能列举一个不用手工Free的例子,谢谢!
      

  4.   

    不是的,一些东西是自管理的,Application不要,主窗口不要!
      

  5.   

    的确,要看create的参数owner而定,如果是application,self则不必自己free,
    因为参数已经指定了所有者,如果owner释放的话,此对象就会自动free.
    如果是nil,则自身自灭吧,就向celeronII(抽烟的鱼)说的那样
      

  6.   

    通常在动态创建一个对象时,调用Free方法是一个好的编程习惯
    例如:
    var
      btn : TButton;
    begin
      btn := TButton.Create(self);
      try
        btn.Parent := Self;
        btn.OnClic := Click;
        ......
      finally
        btn.Free;
      end;
    end;
      

  7.   

    可以自动free的对象,如果自己手动free,会不会因为两次free而引发问题?还是说,如果我们手动free了,程序就不再调用free语句?
      

  8.   

    我想如果对象的owner 是application,self的话,当Application.Destory时候都会自动Free的!
    包括
    var
      btn : TButton;
    begin
      btn := TButton.Create(self);
      try
        btn.Parent := Self;
        btn.OnClic := Click;
        ......
      finally
        btn.Free;
      end;
    end;
      

  9.   

    同意楼上另:若是用户自己编写的类,而且类中使用了资源或类
    则需要写destroy
    而free则是调用destroy的安全手段而已
      

  10.   

    关于Free,我想请教一个问题
    Function FunRead:tstringlist;
    var
      mylist:tstringlist;
    begin
      mylist:=tstringlist.create;
      try
        mylist.add('1');
        mylist.add('2');
        result:=mylist
      finally
        mylist.free;
      end;
    end;procedure tform1.button1onclick(sender:tobject);
    var
      mylist:tstringlist;
    begin
      mylist:=tstringlist.create;
      mylisr:=funRead;
      memo1.lines.addstrings(mylist);
    end;在执行到memo1那句前funread中的mylist已经被释放了.
    只能用全局变量来解决这个问题吗?大家有什么好方法?
      

  11.   

    通常在程里动态创建的对象需要free,否则除非你故意要free他。
      

  12.   

    在不需要时Free,
    var
      btn : TButton;
    begin
      btn := TButton.Create(self);
      try
        btn.Parent := Self;
        btn.OnClic := Click;
        ......
      finally
        btn.Free;
      end;
    end;TButton一般不会一创建就Free吧,可以在Form的onDestroy事件中Free,
    另:
    Function FunRead:tstringlist;
    var
      mylist:tstringlist;
    begin
      if not assigned(mylist) then
        mylist:=tstringlist.create;
      try
        mylist.add('1');
        mylist.add('2');
        result:=mylist
      except
        mylist.free;
      end;
    end;procedure tform1.button1onclick(sender:tobject);
    var
      mylist:tstringlist;
    begin
      mylist:=tstringlist.create;
      mylisr:=funRead;
      memo1.lines.addstrings(mylist);
      myList.Free;
    end;
      

  13.   

    自已建的自已FREE.系统建的系统FREE,如果你愿意,也可以帮系统的忙
      

  14.   

    不是用create方法建的对象,都要Free
    比如:创建一个动态的菜单时,就可能用不着你Free了
    不过用create建对象最好不要用nil做为参数,用Self或Application。
    这样当其Owner释放,动态创建的对象也就释放了
      

  15.   

    以下情况不用自己释放:
    1、系统自动创建。就象窗体的控件。
    2、在Create时指定了Owner的对象。这类对象在Owner释放的时候会自动释放。其他情况需要自己释放。
      

  16.   

    还有一种情况,就是在web开发中响应respone的时候所创建的Stream不用自己释放。:)