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