根据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;
答案 0 :(得分:4)
var
是指向(或访问)整数的访问变量。访问变量var
通常存在于堆栈中。它通常使用4或8个字节的内存。调用hello
时,程序在“堆”上分配一个整数,并将var
设置为指向整数。因此,var
将包含新整数的地址(Ada语言不要求它实际包含地址,但在大多数实现中它将会这样)。释放后,var
将包含 null
。
但是,var'address
没有给出整数的地址,或4或8字节指针的内容。 var'address
是指针本身的地址 - 即它在堆栈中使用的4或8字节的地址。
如果您想获取整数的地址,var.all'address
将起作用,除非var
为null
,然后会引发异常。另一种在访问值和地址之间进行转换的方法是System.Address_To_Access_Conversions
。这适用于在堆上分配的integer
的地址,而不是堆栈上的访问变量的地址。