3

我正在学习 OOP,我遇到了这个问题:

如果我们这样做:

A* a = new A;

运算符从堆中new为变量找到一个空间。a我想知道该变量所在的地址。

问题 1

那个地址是哪一个?这两者有什么区别?

cout <<  a;
cout << &a;

问题2(主要)

假设我没有 delete指针。程序退出。只要指针没有被类的析构函数破坏,当我再次运行程序时,我可以使用它的地址(例如 0x0035fa24)取回该对象吗?如果是,如何?

4

5 回答 5

3

问题 1

那个地址是哪一个?这两者有什么区别?

a对象的地址。&a指针的地址。

问题2(主要)

假设我没有删除指针。程序退出。只要指针没有被类的析构函数破坏,当我再次运行程序时,我可以使用它的地址(例如 0x0035fa24)取回它吗?如果是,如何?

典型的现代操作系统不允许您这样做。当第一个进程退出时,它将回收内存。不允许随后启动的进程查看第一个进程的内存内容,因为这会带来重大的安全风险。

于 2013-02-05T20:19:25.217 回答
2

Q1:

运算符从堆中new为变量找到一个空间a

不,它没有。new运算符创建一个类型为 的对象Aa然后使用该地址初始化变量。

因此,a计算对象所在的地址。

&a计算为变量 a 的地址。

Q2:从技术上讲,这种行为是未定义的(您将取消引用指向不存在的对象的指针)。实际上,答案是“不”。当您退出时,操作系统将释放您进程的所有内存。

于 2013-02-05T20:18:50.633 回答
1

问题一:

你的变量a是一个指针。Take&a给出指针本身的地址,而不是class A存储实例的地址。

问题2:

不,你不能那样做。除非您自己维护这样的列表,否则机器不会为您维护一些“如果 A 的所有实例的列表”。

于 2013-02-05T20:19:38.463 回答
1

对 1 的回答:a将是地址。运算符&返回您稍后写入的地址。用简单的英语,&a会给你一个指针的地址,a将是变量存储的地址,a并且*a是指向的地址的内容a

至于2,我认为理论上是可能的,但实际上是不可能的。

于 2013-02-05T20:20:11.183 回答
1
A* a = new A;
cout <<  a;
cout << &a;

在上面的代码片段中,您在堆上创建了一个新的 A,并将其地址分配给 a。然后打印出 a 的值,这是动态创建的对象的地址。然后打印出指针本身的地址(在堆栈上)。

不,你绝对不能收回会话之间丢失的记忆。

于 2013-02-05T20:20:24.077 回答