释放的访问类型变量应该设置为NULL;为什么它保持相同的地址?

时间:2014-12-30 15:23:11

标签: memory-management ada

根据Adacore网站,一旦释放了访问类型变量,它就会被设置为null。那么为什么在Free之前和之后打印相同的地址?

with ada.Text_IO,ada.Integer_Text_IO;
with ada.Unchecked_Deallocation;
with System.Address_Image;
procedure hello is
   type my_access is access all integer;
   procedure free is new ada.Unchecked_Deallocation(integer,my_access);
   var:my_access:=new integer;
begin
   ada.Text_IO.put_line(System.Address_Image(var'Address));   --- same address
   var.all:=90;
   ada.Integer_Text_IO.put(var.all);
   free(var); -- after free it is set to Null then why same address?
   ada.Text_IO.put_line(System.Address_Image(var'Address));  --- same address why?
end hello;

1 个答案:

答案 0 :(得分:4)

var指向(或访问)整数的访问变量。访问变量var通常存在于堆栈中。它通常使用4或8个字节的内存。调用hello时,程序在“堆”上分配一个整数,并将var设置为指向整数。因此,var 包含新整数的地址(Ada语言不要求它实际包含地址,但在大多数实现中它将会这样)。释放后,var包含 null

但是,var'address没有给出整数的地址,或4或8字节指针的内容。 var'address是指针本身的地址 - 即它在堆栈中使用的4或8字节的地址。

如果您想获取整数的地址,var.all'address将起作用,除非varnull,然后会引发异常。另一种在访问值和地址之间进行转换的方法是System.Address_To_Access_Conversions。这适用于在堆上分配的integer的地址,而不是堆栈上的访问变量的地址。