为什么指针指向它指向的位置?

时间:2014-05-14 18:04:17

标签: c++ pointers compiler-construction stack

我不明白,为什么指针前端指向对象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身体; Berta dtor;

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

我认为会发生这种情况:

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

Hello anton(“Anton”) - 对象将被推送到堆栈

front =& anton;指针指向anton的地址

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

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

前置式>主体(); - 打印Berta身体;为什么会发生这种情况?

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

1 {lowerAddress}

anton< -front< -esp

返回地址

寄存器

{higherAddress}

2

anton< -front

返回地址

寄存器

< -esp

3

安东< - 前

返回地址

贝塔< -esp

所以应该只有两种可能性:anton将被部分覆盖或者它仍然存在而且berta正处于更高的存储位置。如果anton将被部分覆盖,那么前面的> body应该出现一些rnd的东西。如果anton不会被覆盖,那么它应该返回“Anton body;”。

你能解释一下为什么没有发生这种情况吗?相反,berta会覆盖对象anton,以便正面恰好位于berta上?

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

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

1 个答案:

答案 0 :(得分:3)

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

Anton ctor;Anton dtor;

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

然后你创建了Berta,它被推到了安东曾经存在的同一位置的堆栈上,导致front指向Berta。

如果您使用new在堆上分配Anton,Anton会在程序的整个生命周期内持续存在,或者直到您调用delete

编辑:根据Dale的评论,这种行为应该是巧合的。编写假定Berta将始终存在于Anton所在地址的代码是不明智的。