获取未删除指针的值

时间:2013-02-05 20:16:36

标签: c++ oop pointers heap

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

如果我们这样做:

A* a = new A;

new运算符从堆中找到变量a的空格。我想知道变量所在的地址。

问题1

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

cout <<  a;
cout << &a;

问题2(主要)

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

5 个答案:

答案 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。然后打印出一个值,这是动态创建的对象的地址。然后打印出指针本身的地址(在堆栈上)。

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