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,我的应用程序将多次执行此操作。
答案 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;