C ++:将空对象分配给现有对象

时间:2019-03-15 10:43:52

标签: c++ object

编辑:修复了代码以消除一些混乱

正如标题所述,我想知道当我给一个空对象分配一个对象时会发生什么。

这是一个仅包含运算符重载和类数据成员的特定示例:

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,但我现在还不确定。

1 个答案:

答案 0 :(得分:1)

  

当我分配一个对象的成员尚未初始化时会发生什么

将调用赋值运算符。在这种情况下,您提供了一个用户声明的赋值运算符。

提供的运算符(如隐式生成的运算符)读取右操作数的状态,在这种情况下,默认情况下初始化该状态。 p缺少初始化程序,因此隐式默认构造函数将其保留为不确定的值。读取不确定值的行为是不确定的。

也就是说,如果程序可以首先编译。它使用未声明的标识符,并且格式错误。

  

以及我致电new triangle[0]

时会发生什么

将创建一个长度为0的数组。

  

希望我调用新三角形[0]时得到一个nullptr

您的期望被误导了。结果指针将为非空(除非您使用了std::nothrow并且分配失败)。通过该指针进行间接操作将具有不确定的行为。除非使用delete[]释放分配,否则程序将泄漏内存。