Memory management Ada-从异构列表中解除分配

Memory management Ada-从异构列表中解除分配,memory-management,ada,circular-list,Memory Management,Ada,Circular List,我正在通过继承创建一个异构循环链表。作为一种动态分配的数据类型,我需要某种形式的释放,因此我最初想到了Ada.Unchecked\u deallocation。不幸的是,由于根元素被标记,并且我希望能够使用相同的指针类型访问层次结构的任何对象,因此我的访问类型的工作方式是这样的,下面的代码片段将无法编译 type Element is tagged private; type ElementPtr is access all Element'Class; -- fully define Ele

我正在通过继承创建一个异构循环链表。作为一种动态分配的数据类型,我需要某种形式的释放,因此我最初想到了
Ada.Unchecked\u deallocation
。不幸的是,由于根元素被标记,并且我希望能够使用相同的指针类型访问层次结构的任何对象,因此我的访问类型的工作方式是这样的,下面的代码片段将无法编译

type Element is tagged private;
type ElementPtr is access all Element'Class;

-- fully define Element

procedure Free is new Ada.Unchecked_Deallocation(Element, ElementPtr);

有人对我可以用来释放ElementPtr指向的任何继承元素类型的对象所使用的内存的其他释放形式有什么建议吗?谢谢

元素
元素类
是不同的类型, 并且您尝试使用不匹配的类型实例化
未选中的\u解除分配
。 尝试使用
Element'Class
实例化:

无过程是新的Ada.Unchecked\u释放(Element'Class,ElementPtr);

元素
元素类
是不同的类型, 并且您尝试使用不匹配的类型实例化
未选中的\u解除分配
。 尝试使用
Element'Class
实例化:

无过程是新的Ada.Unchecked\u释放(Element'Class,ElementPtr);

供将来参考:当您说“将不编译”时,如果您在问题中添加了实际的错误消息,这将对我们有所帮助。为什么不将其构建在Ada.Containers.Unfinite\u双重链接\u列表之上,并完全避免使用对对象类型的访问?供将来参考:当您说“将不编译”时,如果您在问题中添加了实际的错误消息,这将对我们有所帮助。为什么不将其构建在Ada.Containers.unfinite\u double\u Linked\u列表的顶部,并完全避免使用对对象类型的访问?非常感谢!我认为Element'Class只是Element的一个扩展,这就是我的问题。@OCDkirby它只是Element的一个扩展,但是Ada允许您区分基类(Element)和“类范围类型”(Element及其所有子类):您的免费(每个问题)指针在类范围内时被特别限制为基类。@OCDkirby-许多OOP实现的缺陷之一是容易混淆和混淆“this type”和“this type,以及它的任何派生项”(当然是WRT参数)。Ada通过让
X
明确地引用该类型来避免这种情况,并且
X'Class
引用“this,and anythis down.”非常感谢!我认为Element'Class只是Element的一个扩展,这就是我的问题。@OCDkirby它只是Element的一个扩展,但是Ada允许您区分基类(Element)和“类范围类型”(Element及其所有子类):您的免费(每个问题)指针在类范围内时被特别限制为基类。@OCDkirby-许多OOP实现的缺陷之一是容易混淆和混淆“this type”和“this type,以及它的任何派生项”(当然是WRT参数)。Ada通过让
X
显式地引用该类型来避免这种情况,而
X'Class
则引用“this,and anythis down”