Delphi管理免费内存
情况
我正在从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之间的代码将始终被调用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |