Теперь, можно написать рекурсивную процедуру Free_List, которая будет удалять список, состоящий из объектов типа Element.
Начало списка будет указываться параметром процедуры Free_List, а для непосредственного удаления объекта типа Element
процедура Free_List будет использовать процедуру Free:
with Free; procedure Free_List (List_Head: in out Element) is begin if List_Head.Next /= null Free_List(List_Head.Next); -- рекурсивный вызов end if; Free(List_Head); end Free_List; |
В результате, для удаления показанного ранее списка объектов типа Element
начало которого указывается переменной Head_Element
можно выполнить следующее:
. . . Free_List(Head_Element); . . . |
Следует напомнить, что в рассмотренном нами списке для последнего элемента (узла) значение ссылки Next было равно null.
При описании ссылочного типа Element_Ptr, может быть использована директива компилятора Controlled:
. . . type Element_Ptr is access Element; pragma Controlled(Element_Ptr); . . . |
В этом случае, компилятор будет проинформирован о том, что задачу освобождения распределенного в пуле динамической памяти пространства, для объектов на которые ссылаются значения ссылочного типа Element_Ptr, взял на себя программист.