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