Destruktory


Destruktor jest specjalnym typem metody, która niszczy egzemplarz obiektu, z którego nastąpiło wywołanie destruktora i zwalnia zajmowaną przez ten obiekt pamięć. Deklaracja destruktora wygląda jak deklaracja procedury, ale rozpoczyna sie słowem destructor zamiast procedure. Przykłady:

destructor Destroy;
destructor Destroy; override;

Destruktory muszą używać domyślej konwencji wywoływania rejestracji. Chociaż klasa może mieć więcej niż jeden destruktor, zaleca się, by każda klasa pokrywała odziedziczoną metodę Destroy i nie deklarowała innych destruktorów.

Wywołanie destruktora wymaga kwalifikacji z egzemplarzem obiektu. Przykład:

MyObject.Destroy;

Kiedy destruktor jest wywoływany, wykonywane najpierw są zaimplementowane w nim czynności. Zwykle jest to niszczenie obiektów, do których właściwości danego obiektu stanowią odwołania, oraz zwalnianie zasobów przydzielonych na ich użytek. Później zwalniane są zasoby przydzielone dla obiektu dla którego wywoływany jest destruktor.

Przykład wywołania destruktora:

destructor TShape.Destroy;
begin
  FBrush.Free;
  FPen.Free;
  inherited Destroy;
end;

Ostatnią czynnością implementowaną w destruktorze zwykle jest wywołanie odziedziczonego destruktora w celu zniszczenia odziedziczonych pól.

W razie wystąpienia błędu podczas egzekucji konstruktora, automatycznie wykonywane jest wywołanie destruktora w celu usunięcia z pamięci niedokończonego obiektu. Oznacza to, Destroy musi być przygotowane do zwalniania częściowo wykreowanego obiektu. Powinien sprawdzać przypadek wartości nil w polach typu obiektowego przed próbą wykonania na nich jakich kolwiek operacji. Wywołanie metody Free (zdefiniowanej w klasie TObject), zamiast metody Destroy, stanowi wygodny sposób sprawdzania wartości nil przed destrukcją obiektu.