在两种情况下,在声明块之后(当然是在程序结束之前)内存是否以相同的方式释放:
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;
换句话说,访问类型声明对内存释放有影响吗?
答案 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。