Ada 访问类型声明对解除分配的影响

Ada 访问类型声明对解除分配的影响,ada,Ada,在这两种情况下,在declare块之后(当然在过程结束之前)释放内存的方式是否相同: procedure allocation is type T_Integer_Access is access Integer; begin declare P : T_Integer_Access; begin P := new Integer'(5); end; end; procedure allocation is begin

在这两种情况下,在declare块之后(当然在过程结束之前)释放内存的方式是否相同:

procedure allocation is 
    type T_Integer_Access is access Integer;
begin
    declare
        P : T_Integer_Access;
    begin
        P := new Integer'(5);
    end;
end;

procedure allocation is 
begin
    declare
        type T_Integer_Access is access Integer;
        P : T_Integer_Access;
    begin
        P := new Integer'(5);
    end;
end;
换句话说,访问类型声明对内存释放有影响吗?

在您的示例中,访问类型声明的位置不影响内存的分配或释放方式,但可能会影响内存的分配或释放。在
程序分配的任一变体中
,所附程序的执行如下:

  • 其声明部分的细化导致为访问类型的值分配空间;在这种情况下,该值在概念上可以被认为是指向
    整数的指针或引用
    ;值的空间通常分配在一个表上

  • 执行其已处理的语句序列会导致对创建对象的对象进行求值;在这种情况下,对象是具有值
    5
    整数
    ;对象的空间通常从主机操作系统提供的内存池中分配


在这两种情况下,当block语句结束时,为访问值分配的空间被回收,但为
整数
值分配的空间可能会保留。有关回收已分配存储的更多详细信息,请参阅。

很有可能分配类型为
T\u Integer\u Access
的对象的存储池(内存竞技场)永远不会被释放,因为您尚未定义自己的存储池;在(2.a)处说

默认情况下,实现可能会选择使用单个全局存储池,所有访问类型(默认情况下)都使用该池,这可能意味着只有在分区完成时才会自动回收存储。或者,它可能会选择在每个可访问性级别创建一个新池,这可能意味着在离开适当的作用域时,将回收存储以获得访问类型。其他方案也是可能的

--换句话说,它不是由语言指定的

我认为在库级别之外定义对对象类型的访问是非常不寻常的。我从来没有这样做过,所以我不知道编译器到底在做什么

更新:

valgrind没有在macOS Sierra上运行,所以我用GNAT GPL 2016在Debian jessie上运行;您的
分配
s肯定会泄漏内存


存储池是可终结的,因此您可以实现自己的存储池;或者您可以看看,例如。

应该注意的是,只有在对象的终结释放内存的情况下,才可能存在差异。标准内存池不会自动解除分配
新的
-ed内存。因此,您应该重写
Finalize
以产生这种影响。@B98,什么
Finalize
你是什么意思?我想得很早,草率地假设某个类型的习惯用法是,派生自
Ada.Finalization.Controlled
,而不是
Integer
。派生类型的
Finalize
将被重写以执行存储管理。但是,在这两种情况下,存储池/可能/不同-在不同的时间有效地回收存储。谢谢,我也尝试过GNAT,并注意到了每种情况下的内存泄漏。