Ada 访问类型声明对解除分配的影响
在这两种情况下,在declare块之后(当然在过程结束之前)释放内存的方式是否相同: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
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,并注意到了每种情况下的内存泄漏。