Unser oben eingeführter Typ liste enthält tatsächlich keine Listenwerte, wie sie unsere algebraische Spezifikation beschreibt, sondern Verweise auf solche Werte, weil er ein Pointertyp ist. Deshalb haben sowohl Zuweisung wie Vergleich jetzt andere Auswirkungen als von früher her gewohnt, und wir müssen außerdem jetzt den durch unsere Geflechte belegten Speicher immer explizit freigeben. Dies kann etwa durch folgende rekursive Prozedur geschehen:
Vorsicht! Nach ihrem Aufruf zeigt der Inhalt von l immer noch auf die Halde, ist also ein dangling pointer geworden! Man sollte l anschließend besser mit NIL besetzen (das könnte eine Variante von delete auch direkt tun), wenn man nicht sofort ein neues Geflecht daranhängt. Es ist auch gute Praxis, jede neu deklarierte Variable eines Pointertyps explizit mit dem Wert NIL vorzubesetzen (in objektorientierten Sprachen geschieht das oft automatisch, in Modula 2 leider nicht).PROCEDURE delete(l: liste); BEGIN IF l <> NIL THEN delete(l^.nach); DISPOSE(l); END; END delete;
Für die rekursive Prozedur delete gibt es auch eine iterative Variante, deren Wirkungsweise interessant ist (man sollte ein Beispiel durchspielen). Hier durchläuft der Wertparameter l als lokale Hilfsvariable die ganze Liste bis zum Ende, während ein zweiter Zeiger q immer ein Listenelement weit "nachhinkt". Manchmal nennt man das Schleppzeigertechnik.
PROCEDURE delete(l: liste); VAR q: liste; BEGIN WHILE l <> NIL DO q := l; l := l^.nach; DISPOSE(q); END; END delete;