我正在学习 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 的值,这是动态创建的对象的地址。然后打印出指针本身的地址(在堆栈上)。
不,你绝对不能收回会话之间丢失的记忆。