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;