在阅读有关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
答案 0 :(得分:3)
代码的真正含义是什么?
ValueHolder()
创建一个临时对象,在完整表达式被销毁后,占用的内存也被释放。之后,指针x
和y
立即悬空,对它们的任何取消引用,例如x->value
和y->value
都会导致UB。
在您的情况下,似乎第二个临时对象与被销毁的第一个临时对象具有相同的地址,这很好,但是请注意,不能保证。
答案 1 :(得分:0)
您看到的是归因于undefined behavior。
表达式ValueHolder()
创建一个临时对象,该对象立即被销毁。初始化完成后,转换操作符返回的指针将无效。
由于对象是临时的,因此它允许编译器在下次创建临时对象时重用相同的内存。