Destructor

Adam Boduch

Destructor - słowo kluczowe języka Delphi

Słowo kluczowe destructor służy do deklarowania specjalnych typów metod zwanych destruktorami.

Destruktory używane są w klasach w celu zwolnienia pamięci zarezerwowanej przez konstruktor. Deklaracja destruktora wygląda podobnie jak deklaracja zwykłej metody, z tą różnią, iż poprzedza się ją słowem kluczowym destructor:

type
  TFoo = class
  public
    destructor Bar; 
    { ... }
  end;

{ ... }

destructor TFoo.Bar;
begin
  { jakiś kod }

  inherited;
end;

W programie może być wiele destruktorów, można z nich korzystać w zależności od potrzeb. Nie ma wymogu deklarowania destruktorów w każdej klasie. Ponieważ wszystkie klasy VCL dziedziczą po klasie TObject, destruktor również jest metodą dziedziczoną po klasie TObject. Klasa ta zawiera destruktor o nazwie Destroy; zalecane jest deklarowanie we własnej klasie destuktora, właśnie o nazwie Destroy:

type
  TFoo = class
  public
    destructor Destroy; override;
  end;

{ ... }

destructor TFoo.Destroy; 
begin
{ instrukcje do wykonania }

inherited; 
end;

Ponieważ nasza klasa TFoo dziedziczy po klasie TObject, destruktor Destroy musi być opatrzony klauzulą Override. Pamiętaj o tym, aby w ciele destruktora (na jego końcu) umieścić instrukcję Inherited, która wywołuje destruktor z klasy macierzystej.

Aby destruktor funkcjonował prawidłowo powinien być zadeklarowy jako metoda publiczna klasy (Public).

Na pytanie, po co w ogóle deklarować destruktory we własnej klasie, odpowiedź jest prosta: być może będziemy musieli wykonać pewne instrukcje właśnie w momencie gdy klasa jest zwalniana (przykładowo: zamykanie otwartych zasobów, zamykanie połączenia internetowego itp).

Po zwolnieniu klasy jej użycie bez ponownego skorzystania z konstruktora jest niemożliwe

Konstruktor powinien być wywoływany na samym początku ? przed skorzystaniem z klasy, a destruktor ? na samym końcu, kiedy dana klasa już jest niepotrzebna. ? oto przykład jej wywołania:

var
  Foo: TFoo; // wskazanie na nowy typ ? klasę
begin
  Foo:= TFoo.Create; // wywołanie konstruktora
  Foo.Free; // zwolnienie klasy
end;

Jakkolwiek zwolnienie klasy możliwe jest poprzez nastęujący kod: Foo.Destroy; zaleca się korzystanie z metody Free (która nota bene również jest dziedziczona po klasie TObject). Podwójne użycie destruktora może zakończyć się błędem, metoda Free natomiast, przed zwolnieniem obiektu sprawdza, czy nie został zwolniony wcześniej.

Na platformie .NET sposób korzystania z destruktorów został zmieniony. Więcej informacji na ten temat możesz znaleźć w artykule Destruktory w .NET.

Zobacz też:

2 komentarzy

Błąd - destrukcja jest niezależna od Free, bo ta metoda używa destruktora i sprawdza czy Self (zmienna dotycząca klasy w tej co kod jest wprowadzany) nie ma pamięci, jeśli jest używa destruktora.

Destrukcja klasy odbywa się poprzez wywołanie metody Free.

Właściwie to metody Destroy jak sam napisałeś - zamiast tego zaleca się jednak wywołanie metody Free(). Metoda ta sprawdza wpierw, czy zmienna obiektowa nie zawiera pustego wskazania (NIL) ? jeżeli nie, następuje wywołanie metody Destroy() dla wskazywanego obiektu.

Sam był dodał ale jeszcze nie czytałem o formatowaniu :)