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

In what cases, the this points of two stack-allocated struct objects point to the same address?

本文关键字:this 对象 结构 地址 同一个 分配 情况下 堆栈 两个 在什么      更新时间:2023-10-16

我在阅读如何在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("%dn", x->value);
printf("%dn", y->value);
printf("%pn", (ValueHolder*)x);
printf("%pn", (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。

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

您所看到的是由于未定义的行为

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

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