鉴于以下声明:
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。
答案 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方法中手动分配每个指针的值,并在必要时创建/释放内部对象。