在这两种情况下,在声明块之后(当然是在过程结束之前)是否以相同的方式释放内存:
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;
换句话说,访问类型声明对内存释放有影响吗?
存储池(内存区域)很可能来自于类型对象T_Integer_Access
分配的内存永远不会被释放,因为您还没有定义自己的存储池;ARM 13.11在(2.a)处说
默认情况下,实现可能会选择使用单个全局存储池,所有访问类型(默认情况下)都会使用该存储池,这可能意味着仅在分区完成时才会自动回收存储。或者,它可能会选择在每个可访问级别创建一个新池,这可能意味着在离开适当的范围时会为访问类型回收存储。其他方案也是可能的。
——换句话说,它不是由语言指定的。
我认为除了库级别之外定义对对象类型的访问是非常不寻常的。我从来没有这样做过,所以我不知道编译器实际上是做什么的。
Update:
valgrind不能在 macOS Sierra 上运行,所以我尝试在 Debian jessie 上使用 GNAT GPL 2016;都是你的Allocation
肯定会泄漏内存。
存储池是可最终确定的,因此您可以实现自己的存储池;或者你可能会看,例如,Deepend.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)