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