Процедура Ада Финализация Настройка - Что здесь поставить? - PullRequest
3 голосов
/ 19 августа 2011

С учетом следующих деклараций:

   type Food_T is abstract tagged null record;
   type Food_Ptr is access all Food_T'Class;

   type Wrapper_T is new Ada.Finalization.Controlled with record
      Ptr : Food_Ptr;
   end record;

   procedure Adjust (Object : in out Wrapper_T) is
   begin
      null; -- what goes here ?
   end Adjust;

Мне интересно, как распределить и назначить (глубокое копирование) правильный производный от food_ t, когда я не знаю, на какой тип Object.ptr будет указывать (и где находятся источник и назначение!).

Любая помощь будет оценена.

Спасибо

NWS.

Ответы [ 2 ]

4 голосов
/ 19 августа 2011

Я думаю, вы имеете в виду:

procedure Adjust (Object : in out Wrapper_T) is
begin
   Object.Ptr := new Food_T'Class'(Object.Ptr.all);
end Adjust;

Тогда задача Object.Ptr.all, конечно же, убедиться, что это действительно глубокая копия.(Чтобы сделать это, тип Object.Ptr.all может захотеть получить Ada.Finalization.Controlled. Чтобы разрешить это, вы можете захотеть сделать Food_T интерфейсом , чтобы производный от Food_T тип также мог происходитьAda.Finalization.Controlled.)

0 голосов
/ 08 августа 2017

Допустим, у вас есть два экземпляра, A и B, типа доступа T. Затем, когда вы делаете B: вызывается метод Adjust: = A.

Но будьте осторожны при использовании этого метода, поскольку он может создавать утечки памяти при неправильном использовании! Если ваша идея состоит в том, чтобы B содержать новую ссылку на объект A, оставьте ее пустой. В этом случае каждый указатель в пределах B будет указывать на то же место в памяти, что и указатели в пределах A.

Просто завершите метод, если вы хотите выполнить присваивание типов значений, то есть когда вы хотите, чтобы объекты имели одинаковые «данные», но в разных местах памяти, так что если вы измените A, то B не будет заметьте это. В этом случае вы можете вручную назначить значения каждого указателя в методе Adjust и при необходимости создать / освободить внутренние объекты.

...