编辑:修复了代码以消除一些混乱
正如标题所述,我想知道当我给一个空对象分配一个对象时会发生什么。
这是一个仅包含运算符重载和类数据成员的特定示例:
class triangle
{
vector3d p[3];
vector2d *uv = nullptr;
int nChannels = 0;
public:
void operator=(const triangle &obj)
{
delete[] uv;
nChannels= obj.nChannels;
memcpy(p, obj.p, sizeof(vec3d) * 3);
uv = new vec2d[3 * obj.nChannels];
memcpy(uv, obj.uv, 3 * obj.nChannels * sizeof(vec2d));
}
}
int main()
{
triangle p;
d = p; // where d is some initialized or uninitialized instance of triangle
d = p;
}
简而言之,当我将一个具有尚未初始化的成员的对象分配给另一个对象时,会发生什么;当我调用new triangle [0]时,会发生什么?被赋予nullptr,但我现在还不确定。
答案 0 :(得分:1)
当我分配一个对象的成员尚未初始化时会发生什么
将调用赋值运算符。在这种情况下,您提供了一个用户声明的赋值运算符。
提供的运算符(如隐式生成的运算符)读取右操作数的状态,在这种情况下,默认情况下初始化该状态。 p
缺少初始化程序,因此隐式默认构造函数将其保留为不确定的值。读取不确定值的行为是不确定的。
也就是说,如果程序可以首先编译。它使用未声明的标识符,并且格式错误。
以及我致电
时会发生什么new triangle[0]
将创建一个长度为0的数组。
希望我调用新三角形[0]时得到一个nullptr
您的期望被误导了。结果指针将为非空(除非您使用了std::nothrow
并且分配失败)。通过该指针进行间接操作将具有不确定的行为。除非使用delete[]
释放分配,否则程序将泄漏内存。