"this" 指针上的 const_cast 是未定义的行为吗?
Is const_cast on "this" pointer an undefined behavior?
我得到了以下c++代码。我可以在 Linux 机器上用 g++ 4.9.2 编译它。然后当我 运行 它时,它打印 10。似乎创建了一个新对象并将其分配给在默认构造函数中使用 const_cast 创建的指针。没有内存泄漏(我使用 valgrind 检查过)。这是某种未定义的行为还是合法的?
#include <iostream>
using namespace std;
class A
{
public:
A() : x(0)
{
A *tmp = const_cast<A*>(this);
*tmp = A(10);
}
A(int x)
{
this->x = x;
}
int getX() const
{
return x;
}
private:
int x;
};
int main()
{
A a;
cout << a.getX() << endl;
return 0;
}
const_cast
与您遇到的行为无关。您的代码可能会简化为以下内容:
A() : x(0)
{
*this = A(10);
}
因此,如果我们想使用默认构造函数创建对象,则会发生以下情况:
- 在构造函数体之前对象
this
的内存被保留。
- x(0)
0
分配给 this
的成员 x
。
- A(10) class
A
的新(未命名)对象是使用构造函数 A(int)
创建的。此新对象成员 x
的值为 10
。
- this= 这里未命名的对象被赋值(使用自动生成的复制赋值运算符,它是按字段的)到
*this
。因此,this
的成员 x
的值变为 10
.
- 在那行之后临时未命名对象被销毁。
返回 this
。
这是完全合法和预期的行为。
我得到了以下c++代码。我可以在 Linux 机器上用 g++ 4.9.2 编译它。然后当我 运行 它时,它打印 10。似乎创建了一个新对象并将其分配给在默认构造函数中使用 const_cast 创建的指针。没有内存泄漏(我使用 valgrind 检查过)。这是某种未定义的行为还是合法的?
#include <iostream>
using namespace std;
class A
{
public:
A() : x(0)
{
A *tmp = const_cast<A*>(this);
*tmp = A(10);
}
A(int x)
{
this->x = x;
}
int getX() const
{
return x;
}
private:
int x;
};
int main()
{
A a;
cout << a.getX() << endl;
return 0;
}
const_cast
与您遇到的行为无关。您的代码可能会简化为以下内容:
A() : x(0)
{
*this = A(10);
}
因此,如果我们想使用默认构造函数创建对象,则会发生以下情况:
- 在构造函数体之前对象
this
的内存被保留。 - x(0)
0
分配给this
的成员x
。 - A(10) class
A
的新(未命名)对象是使用构造函数A(int)
创建的。此新对象成员x
的值为10
。 - this= 这里未命名的对象被赋值(使用自动生成的复制赋值运算符,它是按字段的)到
*this
。因此,this
的成员x
的值变为10
. - 在那行之后临时未命名对象被销毁。 返回
this
。
这是完全合法和预期的行为。