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

C++ : Assigning empty object to an existing object

本文关键字:对象 分配      更新时间:2023-10-16

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

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

这是一个特定的示例,仅操作员超载和类数据成员:

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;
}
简而给出一个nullptr,但我不再那么确定了。

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

将调用分配运算符。在这种情况下,您已为用户声明为分配运营商。

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

也就是说,如果可以首先编译该程序。它使用未申报的标识符,并且不形成不良。

,当我称new triangle[0]

时会发生什么

将创建长度0的数组。

我会期望给出新的三角[0] nullptr

您的期望被误导了。最终的指针将是非零的(除非您使用了std::nothrow并且分配失败)。通过该指针进行间接的行为将具有不确定的行为。该程序将泄漏内存,除非分配使用delete[]