5.1 Listy jednokierunkowe 103
noprawny obiekt - może aktywować dowolną metodę swojej klasy, czyli przykładowo sprawdzić swoją zawartość przy pomocy funkcji wypisz.
Przy okazji omawiania operatora dekrementaeji spójrzmy jeszcze na inne jego zastosowanie. W definicji klasy został zawarty jej destruktor. Przypomnijmy, że destruktor jest specjalną funkcją wywoływaną automatycznie podczas niszczenia obiektu. To niszczenie może być bezpośrednie, np. za pomocą operatora delete:
T.TSTA *p=new LISTA; II tworzymy nowy obiekt... delete p; II ... i niszczymy go!
lub też pośrednie, w momencie gdy obiekt przestaje być dostępny. Przykładem tej drugiej sytuacji niech będzie następujący fragment programu:
if (warunek)
(
LISTA p; I
II tworzymy obiekt lokalny // widoczny tylko w tej instrukcji
if
Obiekt p zadeklarowany w ciele instrukcji //jest dla niej całkowicie lokalny. Żaden inny fragment programu nie ma prawa dostępu do niego. Z takim tymczasowym obiektem wiąże się czasem dość sporo pamięci zarezerwowanej tylko dla niego. Otóż, gdyby nie było destruktora, programista nie miałby wcale pewności, czy ta pamięć została w' całości zwrócona systemowo operacyjnemu. Celowo podkreślam, że w' całości, bowiem automatyczne zwalnianie pamięci jest możliwe tylko w przypadku tych zmiennych, które są z założenia lokowane na stosie. Dotyczy to np. zwykłych pól obiektu, ale nie jest możliwe w przypadku struktur dynamicznych, które są nierzadko „rozsiane” po dość sporym obszarze pamięci komputera, l ak jest w przy padku list. drzew, tablic dynamicznych etc. W takim przypadku programista musi sam napisać jawny destruktor, kloty znając1 doskonale sposób, w jaki pamięć została przydzielona obiektowi, będzie ją umiał prawidłowa zwrócić.
Tak też się dzieje w naszym przykładzie. Destruktor ma zaskakująco prostą budowę:
-LISTA() ( while (!pusta O) (*this)—; }
Jest to zwykła pętla while, która tak długo usuwa elementy z listy, aż stanie się ona pusta. Mimo tego, iż nic jest to optymalny sposób na zwolnienie pamięci, został jednak zastosowany w celu ukazania możliwych zastosowań wskaźnika this, który - jak wiemy - wskazuje na „własny” obiekt. Linia (*this)— oznacza
De facto to my go znamy i dzielimy się tą cenną wiedzą z destruktorem... Rozsiane tu i ówdzie personifikacje są nie do uniknięcia w tego typu opisach!