Memory management 释放的访问类型变量应设置为NULL;为什么它保持相同的地址?
根据Adacore网站的说法,一旦释放了访问类型变量,它就会被设置为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
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
,然后将引发异常。另一种在访问值和地址之间转换的方法是。这适用于堆上分配的整数的地址,而不是堆栈上访问变量的地址