在什么情况下,两个堆栈分配的struct对象的this点指向同一地址?

时间:2018-10-13 09:26:33

标签: c++

在阅读有关C ++中内存分配方式的信息时,我遇到了一些代码。但是我不知道为什么两个ValueHolder指针(x,y)指向相同的地址。代码的真正含义是什么?

struct ValueHolder{
  int value;
  operator ValueHolder* () { return this; } // just typecast 
};

void objects_stored_by_pointers_with_autocleanup() {
  ValueHolder * x = ValueHolder();
  ValueHolder * y = ValueHolder();
  x->value = 7;
  y->value = 9;
  printf("%d\n", x->value);
  printf("%d\n", y->value);
  printf("%p\n", (ValueHolder*)x);
  printf("%p\n", (ValueHolder*)y);
}   
int main(int argc, char* argv[]){
  objects_stored_by_pointers_with_autocleanup();
}

预期结果:

7
9
0x55afde2aae70
0x55afde2aae90

实际结果:

9
9
0x7ffeb6d8fcf4
0x7ffeb6d8fcf4

2 个答案:

答案 0 :(得分:3)

  

代码的真正含义是什么?

ValueHolder()创建一个临时对象,在完整表达式被销毁后,占用的内存也被释放。之后,指针xy立即悬空,对它们的任何取消引用,例如x->valuey->value都会导致UB。

在您的情况下,似乎第二个临时对象与被销毁的第一个临时对象具有相同的地址,这很好,但是请注意,不能保证。

答案 1 :(得分:0)

您看到的是归因于undefined behavior

表达式ValueHolder()创建一个临时对象,该对象立即被销毁。初始化完成后,转换操作符返回的指针将无效。

由于对象是临时的,因此它允许编译器在下次创建临时对象时重用相同的内存。