This question already has answers here:
Can a local variable's memory be accessed outside its scope?
(20个答案)
5年前关闭。
我不明白,为什么指针前面指向对象berta(我知道anton和berta是在堆栈上创建的)
输出: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 。
此时,
然后,您创建Berta,并将其推入堆栈中与Anton以前存在的位置相同的位置,从而导致
如果您使用
编辑:根据戴尔的评论,此行为应被认为是巧合。假设Berta总是和Anton处于同一地址,那么编写代码是不明智的。
(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