Przeciążanie destruktorów

From MorphOS Library

Grzegorz Kraszewski


Ten artykuł w innych językach: angielski

Jedynym zadaniem destruktora jest zwolnienie zasobów zarezerwowanych przez konstruktor i inne metody (niektóre zasoby mogą być alokowane na żądanie). W każdym przypadku destruktor musi zostawić obiekt w takim stanie jak zaraz po wywołaniu DoSuperMethod()/DoSuperNew() w konstruktorze. Następnie destruktor wywołuje destruktor w klasie nadrzędnej. Struktura parametrów destruktora jest pusta (zawiera tylko identyfikator metody).

IPTR MyClassDispose(Class *cl, Object *obj, Msg msg)
{
  struct MyClassData *d = (struct MyClassData*)INST_DATA(cl, obj);

  if (d->ResourceA) FreeResourceA();
  if (d->ResourceB) FreeResourceB();
  if (d->ResourceC) FreeResourceC();
  return DoSuperMethodA(cl, obj, msg);
}

Przykładowy destruktor powyżej jest kontynuacją przykładu konstruktora w artykule "Przeciążanie konstruktorów". Zwalnia trzy zasoby przydzielane w konstruktorze. Destruktor jest przygotowany na sytuację, gdy obiekt jest jedynie częściowo skonstruowany, wskaźnik na każdy zasób jest sprawdzany na okoliczność wartości zerowej. Jeżeli dla jakiegoś typu zasobów zero jest porpawnym identyfikatorem, najprościej dodać do danych obiektu flagę, która będzie pamiętała alokację danego zasobu.