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


         

Управление динамическими объектами


Одним из широко распространенных случев использования объектов контролируемых типов являестя решение проблемы "утечки" памяти при работе с динамическими данными.

Предположим, что у нас есть пакет Lists который содержит описание связанного списка List, и спецификация этого пакета выглядит следующим образом:

package Lists is

type List is private;

Underflow : exception;

procedure Insert_At_Head(Item : in out List; Value : in Integer); procedure Remove_From_Head(Item : in out List; Value : out Integer);

procedure Insert_At_Tail(Item : in out List; Value : in Integer); procedure Remove_From_Tail(Item : in out List; Value : out Integer);

function Full(Item : List) return Boolean; function Empty(Item : List) return Boolean;

private

type List is ... -- полное описание типа . . .

end Lists;

Заметим, что тип связанного списка List, который описан в этом пакете, не является контролируемым типом.

Теперь, рассмотрим следующий пример, использующий описание пакета Lists:

with Lists; use Lists;

procedure Memory_Leaks_Demo is

A, B : List; Result : Integer;

procedure Loose_Memory is

C : List; begin

Insert_At_Head(C, 1); Insert_At_Head(C, 2); end Loose_Memory; -- при попадании в эту точку, -- C выходит за пределы области видимости -- и теряется память ассоциируемая с этим узлом

begin

Insert_At_Head(A, 1); Insert_At_Head(A, 2);

Insert_At_Head(B, 3); Insert_At_Head(B, 4);

B := A; -- B и A указывают на один и тот же список -- все узлы "старого" списка B - теряются

Remove_From_Tail(A, Result); -- изменяет как список A, так и список B

end Memory_Leaks_Demo;

В данном примере наглядно демонстрируются проблемы "утечки" памяти при работе с объектами связанного списка List:

    когда объект связанного списка выходит за пределы области видимости, пространство динамической памяти, выделенное для размещения этого объекта, не восстанавливается

  • в случае выполнения присваивания, осуществляется копирование только указателя на "голову" списка (начало списка), а копирование остальной части списка не выполняется



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