在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
In what cases, the this points of two stack-allocated struct objects point to the same address?
我在阅读如何在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()
创建一个临时对象,在完整表达式被销毁后,占用的内存也会释放。之后,指针x
,y
立即晃来晃去,任何对它们的取消引用(如x->value
和y->value
(都会导致 UB。
似乎对于您的情况,第二个临时对象与第一个已被销毁的临时对象获得相同的地址,这很好,但请注意,不能保证。
您所看到的是由于未定义的行为。
表达式ValueHolder()
创建一个临时对象,该对象将立即销毁。一旦初始化完成,转换运算符返回的指针将无效。
由于这些对象是临时的,因此它允许编译器在下次创建临时对象时重复使用相同的内存。
相关文章:
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- QObject::连接无法将信号连接到*this*对象的插槽
- "this"指针的值在对象的生存期内是否恒定?
- 通过从构造函数中的'this'复制的指针改变常量对象
- "this"指向的对象是否与 const 对象相同?
- 将"this"传递给子对象
- 对于琐碎的对象,在"this"上调用新放置是否安全?
- 如何将"this"的生命周期移动到C++中的另一个对象中?
- 是 *this = Ctor();清除对象状态的合法和高效?
- 删除指针后阻止对象使用 "this"
- 返回C++"This"对象的函数
- GCC:当层次结构中存在虚拟继承时,C++11 内联对象初始化(使用 "this")不起作用
- 通过"this"访问另一个对象的定义?
- 对象的"this"指针是否等于指向其(单个)基类的指针?
- C++:将数组传递给构造函数并将其保存在 this 对象中
- 如何从"this"对象本身内部将shared_ptr返回到当前对象
- C++static_cast添加常量和"this"对象的const_cast有什么区别?
- 获取"this"对象到另一个函数的shared_ptr:给出运行时异常
- 声明指向*this*对象的指针的优点或理由是什么?