Ada Finalization调整程序 - 放在这里的内容是什么?

时间:2011-08-19 17:52:46

标签: oop object ada

鉴于以下声明:

   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_将指向什么类型(以及源和目的地在哪里!)时,分配(深层复制)Object.ptr t的正确推导。

任何帮助都将不胜感激。

谢谢,

NWS。

2 个答案:

答案 0 :(得分:4)

我认为你的意思是:

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设为interface,以便Food_T派生类型也可以从Ada派生。 Finalization.Controlled。)

答案 1 :(得分:-2)

假设您有两个访问类型为T的实例A和B.然后在执行B:= A时调用Adjust方法。

但是在使用此方法时要小心,因为它在未正确使用时会造成内存泄漏!如果您的想法是B来保持对对象A的全新引用,则将其留空。在这种情况下,B中的每个指针都将指向内存中与A中指针相同的位置。

如果要执行值类型分配,也就是说,当您希望对象具有相同的"数据时,请完成该方法。但是在不同的内存位置,如果你改变A,那么B就不会注意到它。在这种情况下,您可以在Adjust方法中手动分配每个指针的值,并在必要时创建/释放内部对象。