在阅读有关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

最佳答案


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

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

09-10 01:44