加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi管理免费内存

发布时间:2020-12-15 09:39:09 所属栏目:大数据 来源:网络整理
导读:情况 我正在从Marco Cantu的书中学习Delphi,我已经有了OOP的经验,因为我经常使用Java和PHP.为了更好地理解我正在阅读的内容,我做了这个测试: type TFraction = class private number: double; num,den: integer; fraction: string; function hcf(x: integer
情况

我正在从Marco Cantu的书中学习Delphi,我已经有了OOP的经验,因为我经常使用Java和PHP.为了更好地理解我正在阅读的内容,我做了这个测试:

type
 TFraction = class
  private
   number: double;
   num,den: integer;
   fraction: string;
   function hcf(x: integer; y: integer): integer;
  public
   constructor Create(numerator: integer; denominator: integer); overload;
   constructor Create(value: string); overload;
   function getFraction: string;
 end;

这是一个超级简单的类,它将十进制数转换为分数.我不包括我定义构造函数和函数的代码的其他部分,因为它们对我的问题没用.我以这种方式创建对象.

var a: TFraction;
begin

 a := TFraction.Create(225,35);
 ShowMessage(a.getFraction);
 //The output of ^ is 45/7
 a.Free;

end;

据我所知,我知道一旦我使用它就必须摆脱它,事实上我正在使用Free.通过这种方式,我释放内存,避免内存泄漏.

顺便说一句,我看到我也有可能覆盖析构函数.我不太清楚Free和Destroy的行为.当我必须摆脱一个我不再需要的物体时,我使用Free.当我覆盖析构函数时,我可以释放对象并进行其他操作吗?

简而言之,什么时候使用免费?什么时候我应该更喜欢毁灭?

解决方法

通常,如果您需要在对象销毁期间执行某些操作,则会使用析构函数,否则将无法自动完成.就像释放你在构造函数中初始化的内存一样.在您的示例中,不需要覆盖析构函数,因为(可能)您不会创建需要手动销毁的任何内容.

另外,请记住,Destroy根本不是你想要的 – 无论是内部还是外部.免费自动负责为您调用 – 通过一些额外的工作继续.如果对象是否为零,则自由检查,如果不是nil则仅调用Destroy.

以此为例:

type
  TMyObject = class(TObject)
  private
    FSomeOtherObject: TSomeOtherObject;
  public
    constructor Create;
    destructor Destroy; override;
  end;

constructor TMyObject.Create;
begin
  inherited;
  FSomeOtherObject:= TSomeOtherObject.Create;
end;

destructor TMyObject.Destroy;
begin
  FSomeOtherObject.Free;
  inherited;
end;

就像一个补充说明,我上面看到的用法缺少一些东西.如果Create和Free之间的代码引发了一些异常怎么办?该程序将退出,它永远不会被释放.所以相反,你应该使用try / finally块…

a := TFraction.Create(225,35);
try 
  ShowMessage(a.getFraction);
finally
  a.Free;
end;

这将确保无论try和finally之间发生什么,finally和end之间的代码将始终被调用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读