gpt4 book ai didi

Delphi管理空闲内存

转载 作者:行者123 更新时间:2023-12-03 15:19:55 27 4
gpt4 key购买 nike

情况

我正在从 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;

这是一个 super 简单的类,可以将小数转换为分数。我没有包含定义构造函数和函数的代码的其他部分,因为它们对我的问题没有用处。我正在以这种方式创建对象。

var a: TFraction;
begin

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

end;
<小时/>

问题

根据我所了解到的,我知道一旦使用了该对象,我就必须删除该对象,而事实上我正在使用Free。通过这种方式,我释放了内存并避免了内存泄漏。

顺便说一下,我发现我也有可能重写析构函数。我不太了解 FreeDestroy 的行为。当我必须删除不再需要的对象时,我会使用Free。当我重写析构函数时,我可以释放该对象并执行其他操作吗?

简而言之,什么时候使用免费版比较好?我什么时候应该选择毁灭?

最佳答案

一般来说,如果您需要在对象销毁期间执行某些操作(否则不会自动完成),则可以使用析构函数。就像释放在构造函数中初始化的内存一样。在您的示例中,无需重写析构函数,因为(大概)您没有创建任何需要手动销毁的内容。

此外,请记住 Destroy 根本不打算由您调用 - 无论是在内部还是外部。 Free 会自动为您调用该函数 - 只需进行一些额外的工作即可。 Free 检查对象是否为 nil,如果不是 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;

正如补充说明,我在上面看到的用法缺少一些东西。如果 CreateFree 之间的代码引发一些异常怎么办?该过程将退出,并且永远不会被释放。因此,您应该使用 try/finally block ...

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

这将确保无论tryfinally之间发生什么,finallyend之间的代码将总是被调用。

关于Delphi管理空闲内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39007813/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com