在阅读有关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()
创建一个临时对象,在完整表达式被销毁后,占用的内存也会释放。之后,指针x
和y
立即悬空,对它们的任何取消引用(例如x->value
和y->value
)都将导致UB。
对于您的情况,似乎第二个临时对象与被销毁的第一个临时对象具有相同的地址,这很好,但是请注意,不能保证。