2011-08-19 22 views
3

鉴于以下声明:Ada Finalization调整程序 - 该放什么?

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_吨正确derivitive时,我不知道Object.ptr将指向什么类型(何源&目标是!)。

任何帮助,将不胜感激。

谢谢,

NWS。

回答

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派生出来。)

+0

@Chris,这似乎是工作。谢谢。 NWS。 – NWS

-2

比方说你有两个实例,A和B,访问类型T的调整,当你做B方法,然后调用:= A.

但使用这种方法时要小心,因为如果使用不当,它可能会造成内存泄漏!如果你的想法是B来保存对象A的全新引用,那么将它留空。在这种情况下,B内的每个指针将指向内存中与A内的指针相同的位置。

如果要执行值类型赋值,也就是说,如果希望对象有相同的“数据”,但在不同的存储位置,所以如果你改变了A,那么B就不会注意到它。在这种情况下,您可以手动分配Adjust方法内的每个指针的值,并根据需要创建/释放内部对象。