经常在代码中看到有的用同赋值NIL销毁,有的用DISPOSE有的用FREE,有的用DESTROY有的用FREEANDNIL,甚至还有用两者的组合的,比如先赋值NIL,再用FREEANDNIL的也有,弄的我脑子都乱了,到底怎么用啊,请专家们给总结一下吧!谢谢了!

解决方案 »

  1.   

    对于Delphi对象来说,应该使用free,有时为了防止释放已经free的对象,在free后在赋予nil一边检查,为简便就直接使用FreeAndNil函数了。
      对于接口来说,一般是系统自动释放,如果需要手工释放,使用nil,不能使用Free
      

  2.   

    对于指针的操作:
    New()  dispose()
    GetMem() FreeMem()
    上面在一行的是必要成对使用的;前都分配内存,后者回收内存;
    常用的技巧为:
     try
       new();
     finally
       Dispose()
     end;对于对象操作:
    Create()//----创建对象,分配内存空间;
    Free() FreeAndNil() Destory()//----回收内存,用任一个就可以了,但一般情况下都用前二者.
    为与对象操作安全性有关.在回收一个对象实例时,应先判断这个对象实例是否存在,否则会产生内存访问错的错误.常用的技巧为:
    var
      frm:Tfrom;
    try
     frm:=tform.create(nil);
     ......
    finally
     freeandnil(frm);
    //frm.free;
    //frm:=nil;//不要使用析构方法DESTORY来回收.易造成错误的.
    //实际上,用FREE方法时:是先判断这个对象实例是否存在
    //如果存在,则调用对象的析构方法来回收内存了.
    end; 
      

  3.   

    对于对象通常用free和destory来销毁,二者的区别是,Destroy会直接释放对象,而Free会检查该对象是否存在,如果对象存在,或者对象不为nil,它才会调用Destroy。因此,程序中应该尽量使用free来释放对象,这样更加安全一些。但要注意,free也不会自动将对象置为nil,所以在调用free之后,最好是再手动将对象置为nil。
    而freeandnil过程相当于object.free;object := nil;对于使用new来分配的内存,一般使用dispose来释放空间。
    对于使用getmem分配的内存,一般使用freemem来释放。
      

  4.   

    补充一点,new调用了getmem,dispose调用了freemem.