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.