向大家请教如何正确地释放资源。
在关闭一个窗体之前该做什么处理进行资源释放?
又如果我在应用程序中使用了一个TDataMoudle,TDataMoudle中包含若干的数据访问空间,那么我在退出程序之前进行资源释放,又该如何处理?
在什么时候进行处理比较合适?
再请教FreeAndnil(),free,Destroy之间的不同,什么时候可以使用?问题多多,请大家帮忙了,谢谢!

解决方案 »

  1.   

    通常在关闭一个窗体之前应该释放一些运行期创建的资源。
    FreeAndnil() 为释放一个对象,并以空指针代替
    free 为释放一个对象
    Destroy 为消灭一个对象。
      

  2.   

    Ctrl+鼠标点击函数:FreeAndnil(),free,Destroy
    自己看
      

  3.   

    我知道的:自己声明并创建的变量(资源)需要自己手动释放。
              其他的有delphi自动帮你释放
      

  4.   

    不过我记得一般情况下最好用FREE来释放无用内存,
      

  5.   

    FreeAndnil()

    free; youclass:=nil
    等价
      

  6.   

    那是否是说在设计期间创建的窗体等控件,delphi会自动释放?
    是否要关闭一个窗体时,只要close一下就可以了?不需要自己再进行资源释放?曾看到这样的程序
    在窗体的onclose事件中,有Action:=CaFree;
    在窗体的OnDestroy中,又有Form1:=nil;
    如果说,delphi自己会释放,那上面两个事件中的代码是否画蛇添足?请多多指教!
      

  7.   

    Wally_wu(韦利) :FreeAndnil() 为释放一个对象,并以空指针代替
    free 为释放一个对象
    Destroy 为消灭一个对象。那么执行这三者后果有何不同?什么时候用哪个最好?或者用哪个结果都一样?
      

  8.   

    在窗体的onclose事件中,有Action:=CaFree;
    在窗体的OnDestroy中,又有Form1:=nil;
    写这些代码应该是怕当需要对一个窗体重复创建时,会导致前一次创建的窗体的资源(假定为
    a)没有被释放掉而写。而且delphi自己可能也不能自动回收,因为这时没有指向a的任何指针
    考虑你在一个按钮内写这样的事件
    form1:=tform1.create(self);
    form1.show;
    如果你点击了这个button两次,则tform1类总共被实例化了两次。但是第一次创建的tform1你
    现在能访问的到吗?form1已经指向第二次创建的tform了。因此第一次创建的tform1所占的
    资源成了垃圾,delphi自己可能也不能自动回收这样的垃圾。为了保险,就可以在tform1的
    onclose事件中写上action:=caFree,手动释放每次实例化的资源。
    form1:=nil应该是为了应付这样的情况考虑你在一个按钮内写这样的事件
    if form1<>nil then
      form1:=tform1.create(self);
    form1.show;
    这样的代码保证tform1只会生成一次。但是如果你把生成的tform1关闭了,而且fromclose
    事件里写上了action:=caFree,然后你再点击这个button,因为delphi在资源释放时并没有
    把指向资源的指针清空,所以这时的form1<>nil,但form1指向的内存已被释放了。这样就
    会报一个access violation的错,所以在关闭窗体时form1:=nil;
      

  9.   

    free 与 Destroy 的区别~~~~Destroy 是把不加考虑 直接开注销内存空间 (如你对象指针,已为空,就会出错)

    Free 首先判断对象指针是否有效,再调用 Destroy...
     
    SO:通常情况下, 用Free,安全,更可读一些啦~
    ----------------
    一般,你没用调用特别构造函数(如 .create , GetDC, GetFree) DELPHI 都会自动去清扫如果你动态创建了控件,或开避了新内存,就要相应的手动去消除它了
      

  10.   

    感谢大家的热心帮助;尤其感谢NightCloud()大师详尽的解说,读来犹如行云流水,慧心明目,化去我心中疑霾,真的让人心旷神怡谢谢大家了另外又如果我在应用程序中使用了一个TDataMoudle,TDataMoudle中包含若干(差不多20个adoquery 或者adodataset及相应的datasource)的数据访问控件,该TDataMoudle是在应用程序初始化的时候应用程序创建的。那么我在退出程序之前进行资源释放,又该如何处理?还是系统自己会释放?在关闭主窗体前,我尝试调用了TDataMoudle.free,我发现关闭程序的时间比较长,将近10秒钟,这种情况是否正常?能否使应用程序快一些关闭呢?请大家多多发表意见,谢谢!