如何销毁数组

时间:2011-11-18 05:47:44

标签: delphi delphi-xe2

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需要记录,对象或类类型(Delphi)

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

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

1 个答案:

答案 0 :(得分:8)

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;