Delphi的对象注销方法Destroy和free的区别

当您使用完对象后,您应该及时撤销它,以便把这个对象占用的内存释放出来。您可以通过调用一个注销方法来撤销您的对象,它会释放分配给这个对象的内存。

         Delphi的注销方法有两个:Destroy和Free。Delphi建议使用Free,因为它比Destroy更为安全,同时调用Free会生成效率更高的代码。

          您可以用下列的语句释放用完的Employee对象: 

Employee.Free; 

          和Create方法一样,Free方法也是TEmployee从TObject中继承过来的。把您的注销放在try…finally程序模块的finally部分,而把对象的程序代码放在try部分是编程的好习惯。这样,即使您的程序代码在使用对象时发生了异常事件,也会确保您为这个对象分配的内存会被释放。

二者的区别是,Destroy    会直接释放对象,而Free会事实检查该对象是否存在,如果对象存在,或者对象不为nil,它才会调用Destroy。因此,程序中应  
     该尽量使用free来释放对象,这样更加安全一些。(但要注意,free    也不会自动将对象置为nil,所以在调用free之后,最好是再手动将对象置为nil。)
      TObject类有一个虚拟的Destroy虚构函数和一个非虚拟的Free函数。Free函数中是调用Destroy的。因此,当我们对任何对象(都是TObject的子类对象)调用    .Free();之后,都会执行    TObject.Free();,它会调用我们所使用的对象的析构函数    Destroy();。这就保证了任何类型的对象都可以正确地被析构

转载于:https://www.cnblogs.com/rogee/archive/2010/09/20/1832003.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi 中,线程对象(TThread)继承自 TObject,因此它也可以像其他对象一样进行创建和释放。如果你不显式地调用线程对象Destroy 方法,那么线程对象将在程序结束时自动释放。 然而,如果你的线程在执行期间出现异常或被强制终止,那么它将不会调用 Destroy 方法,因此需要在程序中进行一些特殊处理来确保线程对象的释放。 以下是一些解决方法: 1. 使用 FreeOnTerminate 属性 在创建线程对象后,可以将其 FreeOnTerminate 属性设置为 True,这样在线程终止后,线程对象会自动释放。例如: ```delphi var MyThread: TMyThread; begin MyThread := TMyThread.Create(True); // 创建线程对象 MyThread.FreeOnTerminate := True; // 设置 FreeOnTerminate 属性 MyThread.Resume; // 启动线程 end; ``` 2. 在 OnTerminate 事件中释放线程对象 在线程终止时,会触发 OnTerminate 事件。可以在 OnTerminate 事件中手动释放线程对象。例如: ```delphi procedure TMyThread.DoTerminate; begin inherited; // 释放线程对象 Free; end; ``` 3. 在 try..finally 块中释放线程对象 在主线程中,可以使用 try..finally 块来确保线程对象的释放。例如: ```delphi var MyThread: TMyThread; begin MyThread := TMyThread.Create(True); // 创建线程对象 try MyThread.Resume; // 启动线程 // 等待线程终止 while MyThread.Suspended do Sleep(10); finally MyThread.Free; // 释放线程对象 end; end; ``` 这些都是确保线程对象能够正确释放的方法。在使用线程时,尽量避免出现未处理的异常和强制终止线程的情况,以确保线程对象能够正常释放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值