Как уничтожить массив массивов - PullRequest
2 голосов
/ 18 ноября 2011
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 КБ, мое приложение будет делать это несколько раз.

1 Ответ

8 голосов
/ 18 ноября 2011

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;
...