访问类型声明对释放的影响

时间:2017-03-17 18:54:47

标签: ada

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

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;

换句话说,访问类型声明对内存释放有影响吗?

2 个答案:

答案 0 :(得分:2)

由于您尚未定义自己的存储池,因此分配类型par(mfrow=c(5,2),mar=c(1,1,1,1),mgp=c(5,1.5,0)) for(i in 1:10) {plot(logabun~TEM, data=(paste("species",i,sep="")))} 的对象的存储池(内存区域)很可能不会被释放。 AARM 13.11在(2.a)

  

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

- 换句话说,它没有被语言指定。

我认为除了库级别定义访问对象类型是非常不寻常的。我从来没有这样做过,所以我不知道编译器实际上做了什么。

更新

valgrind 不能在macOS Sierra上运行,所以我尝试使用GNAT GPL 2016的Debian jessie;你的T_Integer_Access绝对是泄密记忆。

存储池可以最终确定,因此您可以实现自己的存储池;或者您可以查看,例如,Deepend

答案 1 :(得分:1)

虽然示例中访问类型声明的 location 不会影响内存的分配或取消分配方式,但chosen storage pool 可能会这样做。在procedure allocation的任一变体中,随附的block statement的执行过程如下:

  • 详细说明其声明部分会导致为访问类型的值分配空间;在这种情况下,该值可以在概念上被认为是Integer的指针或引用;值的空间通常分配在execution stack

  • 执行处理的语句序列会导致评估创建对象的allocator;在这种情况下,对象是Integer,其值为5;对象的空间通常是从主机操作系统提供的内存池中分配的。

在任何一种情况下,当块语句结束时,将回收为访问值分配的空间,但可能会保留为Integer值分配的空间。有关回收已分配存储的其他详细信息,请参阅Ada Programming/Types/access