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

Memory management 释放的访问类型变量应设置为NULL;为什么它保持相同的地址?,memory-management,ada,Memory Management,Ada,根据Adacore网站的说法,一旦释放了访问类型变量,它就会被设置为null。那么,为什么在免费之前和之后打印相同的地址 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.Un

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

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;

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

但是,
var'address
不会给出整数的地址,也不会给出4或8字节指针的内容
var'address
是指针本身的地址,也就是它在堆栈上使用的4或8个字节的地址


如果要获取整数的地址,
var.all'address
将起作用,除非
var
null
,然后将引发异常。另一种在访问值和地址之间转换的方法是。它使用堆上分配的
整数的地址,而不是堆栈上访问变量的地址。

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

但是,
var'address
不会给出整数的地址,也不会给出4或8字节指针的内容
var'address
是指针本身的地址,也就是它在堆栈上使用的4或8个字节的地址

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