This question already has answers here:
Can a local variable's memory be accessed outside its scope?
                                
                                    (20个答案)
                                
                        
                                5年前关闭。
            
                    
我不明白,为什么指针前面指向对象berta(我知道anton和berta是在堆栈上创建的)

1 Hello* front;
2
3 void createHello() {
4   Hello anton("Anton");
5   front = &anton;
6 }
7
8 int main() {
9   createHello();
10  Hello berta("Berta");
11  front->body();
12}

1 class Hello {
2     Hello(const char* name) : name(name) {
3     out.print(name);
4     out.print(" ctor;");
5   }
6
7   ~Hello(){
8     out.print(name);
9     out.print(" dtor;");
10  }
11
12  void body () {
13    out.print(name);
14    out.print( " body;");
15  }
16
17  const char* name;
18};


输出:Anton ctor; Anton dtor; Berta ctor; Berta body; Berta dtor;

out.print()是一个简单的函数,可在监视器上打印字符串

我以为会发生:

createHello()-将寄存器压入堆栈,将返回地址压入堆栈

你好anton(“ Anton”)-对象将被推入堆栈

前=&anton;指针从安东指向地址

esp-将设置为函数调用之前的位置

您好berta(“ Berta”); -对象“ berta”将被推入堆栈

front-> body(); -打印Berta身体;为什么发生这种情况?

我的意思是前端指针应指向堆栈中的不同位置:

1. {lowerAddress}

安东
退货地址

寄存器

{higherAddress}

2。

安东
退货地址

寄存器


3。

安东
退货地址

伯塔
因此,应该只有两种可能性:anton将被部分覆盖或它仍然存在,并且berta处于较高的存储位置。如果将部分覆盖anton,则应该为front-> body出现一些rnd的东西。如果不会覆盖anton,则应返回“ Anton body;”。

您能向我解释为什么没有发生吗?而是由berta覆盖对象anton,以便使正点恰好位于berta上?

@Edit忘记了*,所以前面是一个指针

@Edit我永远不会编程。这样-我的大学给了我这个废话-idk如何解决它-是的,我只能说“嗯,berta正是在anton上创建的,并且覆盖了他”,但我不明白为什么-通常应该在更高的地址上创建berta 。

最佳答案

一旦您对createHello()的调用返回,Anton就会超出范围并调用其析构函数,因此输出如下:

Anton ctor;Anton dtor;


此时,front是一个悬空指针。

然后,您创建Berta,并将其推入堆栈中与Anton以前存在的位置相同的位置,从而导致front指向Berta。

如果您使用new在堆上分配Anton,则Anton将在程序的整个生命周期中一直存在,直到您调用delete

编辑:根据戴尔的评论,此行为应被认为是巧合。假设Berta总是和Anton处于同一地址,那么编写代码是不明智的。

关于c++ - 为什么指针指向它指向的位置? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23661913/

10-14 09:46