Как уничтожить массив массивов

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 КБ, мое приложение будет делать это несколько раз.


person VibeeshanRC    schedule 18.11.2011    source источник
comment
Вы не можете и не должны уничтожать статический массив.   -  person RRUZ    schedule 18.11.2011
comment
почему -1 , укажите причину   -  person VibeeshanRC    schedule 18.11.2011
comment
Я тоже хочу знать. @vibeeshanRC, вы не можете уничтожить TColor. если бы это был массив классов, вы можете, но TColor не является классом. Можете ли вы опубликовать больше кода?   -  person Arjen van der Spek    schedule 18.11.2011
comment
Спасибо, но я думал, что tcolor - это класс, и мне нужно освободить эти объекты.   -  person VibeeshanRC    schedule 18.11.2011
comment
TColor — это просто целое число. Это тип значения, и его не нужно уничтожать. Как бы то ни было, никогда не звоните Destroy, вместо этого звоните Free. Но этот совет для случаев, когда у вас есть объект.   -  person David Heffernan    schedule 18.11.2011
comment
@vibeeshanRC Дэвид Хеффернан уже дал вам ответ и совет на будущее, теперь позвольте мне дать вам совет, удерживайте клавишу CTRL и щелкните мышью на TColor, и IDE перенесет вас к объявлению типа, то же самое относится и к другим типы, предположим, что у вас есть объявление var, такое как var a: TStringList;, удерживайте CTRL и щелкните мышью на TStringList, чтобы найти его определение, таким образом вы можете узнать, нужно ли освобождать переменную или нет, также вы можете захотеть используйте FreeAndNil( AVARIABLE ) вместо вызова .Free   -  person    schedule 18.11.2011


Ответы (1)


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;
person David Heffernan    schedule 18.11.2011
comment
Спасибо, мой вопрос на самом деле не точен, но ваш ответ прояснил мне, что я должен делать. - person VibeeshanRC; 18.11.2011