我正在学习 OOP,我遇到了这个问题:
如果我们这样做:
A* a = new A;
运算符从堆中new
为变量找到一个空间。a
我想知道该变量所在的地址。
问题 1
那个地址是哪一个?这两者有什么区别?
cout << a;
cout << &a;
问题2(主要)
假设我没有 delete
指针。程序退出。只要指针没有被类的析构函数破坏,当我再次运行程序时,我可以使用它的地址(例如 0x0035fa24)取回该对象吗?如果是,如何?
我正在学习 OOP,我遇到了这个问题:
如果我们这样做:
A* a = new A;
运算符从堆中new
为变量找到一个空间。a
我想知道该变量所在的地址。
问题 1
那个地址是哪一个?这两者有什么区别?
cout << a;
cout << &a;
问题2(主要)
假设我没有 delete
指针。程序退出。只要指针没有被类的析构函数破坏,当我再次运行程序时,我可以使用它的地址(例如 0x0035fa24)取回该对象吗?如果是,如何?
问题 1
那个地址是哪一个?这两者有什么区别?
a
是对象的地址。&a
是指针的地址。
问题2(主要)
假设我没有删除指针。程序退出。只要指针没有被类的析构函数破坏,当我再次运行程序时,我可以使用它的地址(例如 0x0035fa24)取回它吗?如果是,如何?
典型的现代操作系统不允许您这样做。当第一个进程退出时,它将回收内存。不允许随后启动的进程查看第一个进程的内存内容,因为这会带来重大的安全风险。
Q1:
运算符从堆中
new
为变量找到一个空间a
不,它没有。new
运算符创建一个类型为 的对象A
。a
然后使用该地址初始化变量。
因此,a
计算对象所在的地址。
&a
计算为变量 a 的地址。
Q2:从技术上讲,这种行为是未定义的(您将取消引用指向不存在的对象的指针)。实际上,答案是“不”。当您退出时,操作系统将释放您进程的所有内存。
问题一:
你的变量a
是一个指针。Take&a
给出指针本身的地址,而不是class A
存储实例的地址。
问题2:
不,你不能那样做。除非您自己维护这样的列表,否则机器不会为您维护一些“如果 A 的所有实例的列表”。
对 1 的回答:a
将是地址。运算符&
返回您稍后写入的地址。用简单的英语,&a
会给你一个指针的地址,a
将是变量存储的地址,a
并且*a
是指向的地址的内容a
。
至于2,我认为理论上是可能的,但实际上是不可能的。
A* a = new A;
cout << a;
cout << &a;
在上面的代码片段中,您在堆上创建了一个新的 A,并将其地址分配给 a。然后打印出 a 的值,这是动态创建的对象的地址。然后打印出指针本身的地址(在堆栈上)。
不,你绝对不能收回会话之间丢失的记忆。