Ада-95. Компилятор GNAT



Освобождение пространства динамической памяти - часть 2


/p>

Теперь, можно написать рекурсивную процедуру 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, взял на себя программист.




Содержание  Назад  Вперед