gpt4 book ai didi

delphi - 如何销毁数组数组

转载 作者:行者123 更新时间:2023-12-03 18:14:59 25 4
gpt4 key购买 nike

myarr : array [0 .. 21] of array [0 .. 21] of TColor;

以上是声明,使用后我想销毁数组的数组
for a := 0 to 21 do
for b := 0 to 21 do
myarr[a][b].destroy ;
//myarr[a,b].destroy ;

两个代码都给我错误,

E2018 Record, object or class type required (Delphi)



这实际上是在一个类中实现的,我想在类的对象被销毁时这样做

当执行鼠标单击时,我已经实现了这一点,必须销毁前一个对象(包括此数组)并必须创建一个新对象。实际上,当这种情况发生时,它们必须没有任何额外的内存,但是当我 checkin 时每次单击我的 Windows 任务管理器都会添加另外 200 kb,我的应用程序将多次执行此操作。

最佳答案

TColor是整数类型,值类型,不是类。因此,它不需要被释放。 TColor的定义是

TColor = -$7FFFFFFF-1..$7FFFFFFF;

因此,出于分配的目的,您的数组几乎等同于
myarr: array [0..21] of array [0..21] of Integer;

这种数组的元素不需要被释放。数组本身将被自动释放,无论您在何处声明它(全局、本地、类成员、记录成员)。它也是一种值类型。

无需释放的最佳线索 TColor是你一开始就没有创造它。分配和释放总是成对的。

顺便说一句,你不应该调用 Destroy直接地。你写 Destroy仅在实现类的重写析构函数时才在代码中,即像这样:
destructor Destroy; override;
...
destructor TMyClass.Destroy;
begin
FMyObject.Free;
inherited;
end;

当你来破坏一个对象时,你应该调用 Free在上面。做 不是 调用 Destroy直接地。为什么不?好吧, Free是这样实现的:
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
if语句意味着如果你有一个对象引用是 nil , 那么调用 Free 是安全的不必担心引发异常。

如果在构造函数中引发异常,这很重要。当这种情况发生时,析构函数被调用。如果构造函数只完成了部分,那么一些字段仍将是 nil .调用 Free允许我们编写干净的析构函数代码。如果没有这种便利,我们所有的析构函数都会像这样:
destructor TMyClass.Destroy;
begin
if FMyObject3<>nil then
FMyObject3.Destroy;
if FMyObject2<>nil then
FMyObject2.Destroy;
if FMyObject1<>nil then
FMyObject1.Destroy;
inherited;
end;

关于delphi - 如何销毁数组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8178288/

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