我不明白,为什么指针前端指向对象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应该在更高的地址上创建
答案 0 :(得分:3)
一旦您对createHello()
的调用返回,Anton就会超出范围并调用其析构函数,因此输出:
Anton ctor;Anton dtor;
此时,front
是一个悬空指针。
然后你创建了Berta,它被推到了安东曾经存在的同一位置的堆栈上,导致front
指向Berta。
如果您使用new
在堆上分配Anton,Anton会在程序的整个生命周期内持续存在,或者直到您调用delete
。
编辑:根据Dale的评论,这种行为应该是巧合的。编写假定Berta将始终存在于Anton所在地址的代码是不明智的。